如何强制视图更新?

KnowLittle 2003-06-30 11:06:59
不知道是不是sqlserver2000的bug

我发现如下问题
修改数据表Table1(比如加减字段)
和Table1相关的部分视图的结果集出现错误。
由此导致和视图相关的程序运行发生错误。

其实这个视图并没有错误,重新运行一下,结果集就对了。


我想知道有没有办法强制更新所有的视图?
因为我实在很难要求客户去运行视图,而且还需要整理哪些需要运行。


重启Sqlserver服务我试过了,没用。:(

请大家帮忙!
...全文
240 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2003-06-30
  • 打赏
  • 举报
回复
试试这个,将所有的视图重新生成一次,测试过没问题后,去掉事务处理,以便真正更改视图.
begin tran
declare @viewname varchar(250),@id int,@text varchar(8000)
declare #aa cursor for select id,name
from sysobjects
where objectproperty(id,'IsView')=1 and uid=1 and left(name,3)<>'sys'
open #aa
fetch next from #aa into @id,@viewname
while @@fetch_status=0
begin
select @text=''
select @text=@text+char(13)+text
from syscomments
where id=@id
exec('drop view '+@viewname)
-- print @viewname
exec(@text)
-- print @text
fetch next from #aa into @id,@viewname
end
close #aa
deallocate #aa

rollback tran

happydreamer 2003-06-30
  • 打赏
  • 举报
回复
To大力 用function也是同样的问题

如果
alter table tbname add id int identity(1,1)
不重建function 直接select * from V_Name()
还是反应不出增加的id列

如果function已包括id列
alter table tbname drop column id
不重建function

视图或函数 'V_Name' 指定的列名比其定义中的列多。
服务器: 消息 4413,级别 16,状态 1,行 1
由于绑定错误,未能使用视图或函数 'V_Name
happydreamer 2003-06-30
  • 打赏
  • 举报
回复
To大力 用function也是同样的问题

如果
alter table tbname add id int identity(1,1)
不重建function 直接select * from V_Name()
还是反应不出增加的id列

如果function已包括id列
alter table tbname drop column id
不重建function

视图或函数 'V_Name' 指定的列名比其定义中的列多。
服务器: 消息 4413,级别 16,状态 1,行 1
由于绑定错误,未能使用视图或函数 'V_Name
happydreamer 2003-06-30
  • 打赏
  • 举报
回复
加字段 视图不能反应出来的
减字段 会出现绑定错误 提示view的列名比表定义中的列多

可以重建视图来解决

pengdali 2003-06-30
  • 打赏
  • 举报
回复
如果是2000可以用function 代替view

create function V_Name()
returns table
as
return(select * from XX)

调用:
select * from V_Name()


甚至可以用“参数视图”

create function V_Name(@a int)
returns table
as
return(select * from XX where 列=@a)

调用:
select * from V_Name(23)
pengdali 2003-06-30
  • 打赏
  • 举报
回复
如果是2000可以用function 代替view

create function V_Name()
returns table
as
return(select * from XX)

调用:
select * from V_Name()


甚至可以用“参数视图”

create function V_Name(@a int)
returns table
as
return(select * from XX where 列=@a)

调用:
select * from V_Name(23)
BenyMo 2003-06-30
  • 打赏
  • 举报
回复
我試過把視圖的語句導出...刪除視圖...再把導出的語句運行一次..
happydreamer 2003-06-30
  • 打赏
  • 举报
回复
数据表更新了,不重新select from view 好像看不出数据变化的
是不是可以考虑数据修改了触发重新检索视图
KnowLittle 2003-06-30
  • 打赏
  • 举报
回复
那有什么办法解决这个问题吗?
pengdali 2003-06-30
  • 打赏
  • 举报
回复
这不是bug是sqlserver的限制,如:
create view xx as
select * from 表

sqlserver会进行预编译,这样可以提高效率,但你修改了列,如添加列,删除列就会报错
KnowLittle 2003-06-30
  • 打赏
  • 举报
回复
什么补丁?sp3?
CrazyFor 2003-06-30
  • 打赏
  • 举报
回复
打一下补丁试试呢
KnowLittle 2003-06-30
  • 打赏
  • 举报
回复
没用,我试过了。
这个子句好像不是做这个用的,具体干什么我也不太理解。
不过还是谢谢。
CrazyFor 2003-06-30
  • 打赏
  • 举报
回复
CREATE VIEW [ < database_name > .] [ < owner > .] view_name [ ( column [ ,...n ] ) ]
[ WITH < view_attribute > [ ,...n ] ]
AS
select_statement
[ WITH CHECK OPTION ]

< view_attribute > ::=
{ ENCRYPTION | SCHEMABINDING | VIEW_METADATA }


TRY:


WITH CHECK OPTION

强制视图上执行的所有数据修改语句都必须符合由 select_statement 设置的准则。通过视图修改行时,WITH CHECK OPTION 可确保提交修改后,仍可通过视图看到修改的数据。
KnowLittle 2003-06-30
  • 打赏
  • 举报
回复
我最后用了zjcxc(邹建) 的办法,做了一些改进。
其中也发现一个很奇怪的问题,当然最后解决了。但是原因就不太清楚了。


begin tran UpdateViews
declare @viewname varchar(250),@id int,@text varchar(8000)

declare @text2 varchar(8000)
set @text2=''

select id,name into temptb
from sysobjects
where objectproperty(id,'IsView')=1 and uid=1 and left(name,3)<>'sys' order by name

--如果不用这个临时表,在下面的游标会出错
--也就是会重复对一个视图进行反复的删除和新建

declare #aa cursor for select * from temptb
open #aa
declare @count int
select @count=0
fetch next from #aa into @id,@viewname
while @@fetch_status=0
begin

select @count=@count+1
select @text=''
select @text=@text+char(13)+text
from syscomments
where id=@id and colid=1
select @text2=''
select @text2=@text2+char(13)+text
from syscomments
where id=@id and colid=2

print @id
exec('drop view '+@viewname)
print @viewname
-- print @text+@text2
exec(@text+@text2)

fetch next from #aa into @id,@viewname
end
close #aa
deallocate #aa

print @count

drop table temptb

if @@ERROR<>0 ROLLBACK else Commit Tran UpdateViews

KnowLittle 2003-06-30
  • 打赏
  • 举报
回复
zjcxc(邹建)
的办法基本可以

但是我有一些视图不知道为什么,拿出来text的时候被截断了,导致执行生成语句的时候出错。
没到8000个字阿?只有4000多个字。
happydreamer 2003-06-30
  • 打赏
  • 举报
回复
定义视图没有with recomplie语句
KnowLittle 2003-06-30
  • 打赏
  • 举报
回复
各位参与让偶很是感激!



把视图改成Function的方式,不可行,因为系统还要支持sql7。0

重新生成所有的视图我也考虑过,但是工作量过大。而且其中的视图错综复杂,又有很多依存关系。生成视图很麻烦。

有没有办法或者命令让视图自己全部重新运行一遍呢?

我想既然是因为预编译导致的错误,那么能不能通过一个什么法子让他重新编译一下。(当然不是一个一个去重新运行或者生成)
KnowLittle 2003-06-30
  • 打赏
  • 举报
回复
各位参与让偶很是感激!


把视图改成Function的方式,不可行,因为系统还要支持sql7。0

重新生成所有的视图我也考虑过,但是工作量过大。而且其中的视图错综复杂,又有很多依存关系。生成视图很麻烦。

有没有办法或者命令让视图自己全部重新运行一遍呢?

我想既然是因为预编译导致的错误,那么能不能通过一个什么法子让他重新编译一下。(当然不是一个一个去重新运行或者生成)
KnowLittle 2003-06-30
  • 打赏
  • 举报
回复
各位参与让偶很是感激!
把视图改成Function的方式,不可行,因为系统还要支持sql7。0

重新生成所有的视图我也考虑过,但是工作量过大。而且其中的视图错综复杂,又有很多依存关系。生成视图很麻烦。

有没有办法或者命令让视图自己全部重新运行一遍呢?

我想既然是因为预编译导致的错误,那么能不能通过一个什么法子让他重新编译一下。(当然不是一个一个去重新运行或者生成)
第一篇 Oracle管理配置 第1章 Oracle安装配置(教学视频:10分钟) 23 1.1 Oracle简介 23 1.1.1 数据库术语 23 1.1.2 主流数据库简介 24 1.1.3 Oracle数据库的特点 24 1.2 安装Oracle数据库 25 1.2.1 Oracle数据库的版本变迁及安装环境 25 1.2.2 安装过程 26 1.2.3 安装中需要注意的问题 27 1.3 本章小结 28 1.4 习题 28 第2章 Oracle常用工具(教学视频:7分钟) 29 2.1 Net Configuration Assistant(网络配置助手) 29 2.1.1 监听程序配置 29 2.1.2 命名方法配置 31 2.1.3 本地Net服务名配置 32 2.2 Net Manager(网络管理员) 34 2.3 本章实例 36 2.4 本章小结 38 2.5 习题 38 第3章 SQL Plus和PL/SQL(教学视频:11分钟) 39 3.1 SQL Plus与PL/SQL简介 39 3.2 使用SQL Plus 40 3.2.1 登录SQL Plus 40 3.2.2 SQL Plus输出结果的格式化 41 3.2.3 SQL Plus小结 46 3.3 PL/SQL 46 3.3.1 PL/SQL常用开发工具 46 3.3.2 开发一个简单的PL/SQL程序 48 3.4 本章实例 49 3.5 本章小结 50 3.6 习题 50 第二篇 Oracle数据库对象 第4章 Oralce数据库(教学视频:15分钟) 51 4.1 创建Oracle数据库 51 4.2 Oracle数据库的相关术语 52 4.2.1 数据库 53 4.2.2 数据库实例和SID 53 4.2.3 ORACLE_SID 54 4.3 Oracle数据库的备份与恢复 55 4.3.1 逻辑备份/恢复(导出/导入) 55 4.3.2 物理备份/恢复 56 4.3.3 利用PL/SQL Developer备份数据库 60 4.4 本章实例 61 4.5 本章小结 61 4.6 习题 62 第5章 Oracle数据表对象(教学视频:42分钟) 63 5.1 Oracle表空间 63 5.1.1 Oracle表空间简介 63 5.1.2 创建Oracle表空间 64 5.1.3 查看表空间 66 5.1.4 修改数据库默认表空间 67 5.1.5 修改表空间名称 68 5.1.6 删除表空间 69 5.2 创建Oracle数据表 70 5.2.1 利用工具创建数据表 70 5.2.2 利用工具查看数据表 71 5.2.3 利用命令创建数据表 72 5.2.4 利用命令查看表结构 72 5.3 修改Oracle数据表结构 73 5.3.1 利用工具修改数据表结构 73 5.3.2 利用命令修改数据表结构 74 5.4 删除数据表 75 5.4.1 利用工具删除数据表 76 5.4.2 利用SQL语句删除数据表 76 5.5 备份/恢复数据表 76 5.5.1 利用工具备份/恢复数据表 77 5.5.2 利用命令备份/恢复数据表 82 5.6 临时表 83 5.6.1 临时表简介 83 5.6.2 会话级临时表 84 5.6.3 事务级临时表 85 5.6.4 查看临时表在数据库中的信息 86 5.6.5 临时表的应用场景 86 5.7 特殊的表dual 87 5.7.1 分析dual表 87 5.7.2 dual表的应用场景 87 5.7.3 修改dual表对查询结果的影响 88 5.8 本章实例 89 5.9 本章小结 90 5.10 习题 90 第6章 约束(教学视频:43分钟) 91 6.1 主键约束 91 6.1.1 主键简介 91 6.1.2 创建主键约束 92 6.1.3 修改表的主键约束 94 6.1.4 主键应用场景 96 6.2 外键约束 97 6.2.1 外键简介 97 6.2.2 创建外键约束 97 6.2.3 级联更新与级联删除 100 6.2.4 修改外键属性 102 6.2.5 外键使用 104 6.3 唯一性约束 105 6.3.1 唯一性约束简介 105 6.3.2 创建唯一性约束 105 6.3.3 修改唯一性约束 107 6.3.4 唯一性约束的使用 108 6.4 检查约束 108 6.4.1 检查约束简介 108 6.4.2 创建检查约束 108 6.4.3 修改检查约束 110 6.4.4 检查约束的使用 111 6.5 默认值约束 111 6.5.1 默认值约束简介 112 6.5.2 创建默认值约束 112 6.5.3 修改默认值约束 113 6.6 本章实例 115 6.7 本章小结 116 6.8 习题 116 第7章 视图(教学视频:50分钟) 117 7.1 关系视图 117 7.1.1 建立关系视图 117 7.1.2 修改/删除视图 118 7.1.3 联接视图 120 7.1.4 编译视图 122 7.1.5 使用force选项强制创建视图 124 7.1.6 利用视图更新数据表 125 7.1.7 with check option选项 126 7.1.8 关系视图小结 128 7.2 内嵌视图 128 7.2.1 内嵌视图简介 128 7.2.2 内嵌视图的使用 128 7.2.3 内嵌视图小结 130 7.3 对象视图 131 7.3.1 对象视图简介 131 7.3.2 对象视图简介 131 7.4 物化视图 133 7.4.1 物化视图简介 133 7.4.2 物化视图的使用 133 7.4.3 物化视图的数据加载 135 7.4.4 物化视图的数据更新 135 7.4.5 查询重写 136 7.5 本章小结 136 7.6 本章实例 137 7.7 习题 137 第8章 函数与存储过程(教学视频:48分钟) 138 8.1 函数 138 8.1.1 函数简介 138 8.1.2 创建函数 139 8.1.3 函数中的括号 140 8.1.4 函数的参数 141 8.1.5 函数的确定性 142 8.1.6 典型函数举例 143 8.2 存储过程 144 8.2.1 存储过程简介 144 8.2.2 创建存储过程 144 8.2.3 存储过程的参数——IN参数 146 8.2.4 存储过程的参数——OUT参数 147 8.2.5 存储过程的参数——IN OUT参数 149 8.2.6 存储过程的参数——参数顺序 149 8.2.7 存储过程的参数——参数的默认值 152 8.2.8 存储过程的参数——参数顺序总结 153 8.3 程序包 153 8.3.1 规范 153 8.3.2 主体 155 8.3.3 调用程序包中的函数/存储过程 157 8.3.4 程序包中的变量 158 8.4 本章实例 159 8.5 本章小结 161 8.6 习题 161 …… 第9章 游标(教学视频:36分钟) 162 第10章 触发器(教学视频:58分钟) 178 第11章 序列(教学视频:28分钟) 206 第12章 用户角色与权限控制(教学视频:45分钟) 215 第三篇 Oracle中的SQL 第13章 Oracle数据类型(教学视频:21分钟) 231 第14章 Oracle中的函数与表达式(教学视频:111分钟) 240 第15章 Oracle中的控制语句(教学视频:16分钟) 282 第16章 SQL查询(教学视频:55分钟) 290 第17章 SQL更新数据(教学视频:34分钟) 319 第四篇 Oracle编程高级应用 第18章 数据库速度优化与数据完整性(教学视频:32分钟) 332 第19章 数据一致性与事务管理(教学视频:46分钟) 341 第20章 并发控制(教学视频:35分钟) 356 第21章 Oracle中的正则表达式(教学视频:29分钟) 369 第五篇 Oracle与编程语言综合使用实例 第22章 Oracle在Java开发中的应用(教学视频:38分钟) 376 第23章 Oracle在C#开发中的应用(教学视频:12分钟) 391

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧