bitscn.com
mssql中视图的架构绑定(schemabingding)与视图批量更新
create view 的语法如下
create view [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ with [ ,...n ] ]
as select_statement
[ with check option ] [ ; ]
::=
{
[ encryption ]
[ schemabinding ]
[ view_metadata ] }
其中 schemabinding表示对基表进行修改时不能影响到该视图的定义,若对基本的修改影响力该视图的定义,则要求先删除该视图。
使用 schemabinding要求视图的定义中不能进行 select * 查询,而且基表名称必须包含架构名称(两部分命名).
下面进行样例解释了架构绑定与非架构绑定的区别.
首先创造基表,语句如下:
create table t1
(
id int primary key,
name nvarchar(200),
address nvarchar(200)
)
create table t2
(
id int primary key,
name nvarchar(200),
address nvarchar(200)
)
然后创建两个视图,一个进行架构绑定,另一个不进行架构绑定
create view v_t1
as
select id, name, address from t1;
go
create view v_t2
with schemabinding
as
select id, name, address from dbo.t2;
go
此时我要对基表的结构进行修改,例如删除字段address,删除t1的address字段是可以的,但删除t2的address字段是不允许的。
下面我们还用t1作为基表使用select * 语法创建视图
create view v_t1
as
select * from t1;
go
创建视图后再对基表进行修改,添加了字段email,如下
alter table t1 add email nvarchar(20)
但此时对视图v_t1进行查询,email列是不显示的
必须对视图v_t1进行更新后,才能显示email列,我们可以对v_t1删除后重建
if object_id('v_t1') is not null
drop view v_t1
go
create view v_t1
as
select * from t1;
go
或者使用 sp_refreshview 系统存储过程,代码如下
sp_refreshview 'v_t1'
若系统中有大量的视图需要更新,则下面的代码可以对所有没有进行架构绑定的视图进行批量更新
declare @sql as nvarchar(max)
set @sql = ''
select @sql = @sql + 'exec sp_refreshview' + quotename(table_name, '''')+ '; '
from information_schema.views
where objectproperty(object_id(table_name), 'isschemabound') = '0'
exec sp_executesql @sql
bitscn.com