多个SQL视图,单点定义,如何?

时间:2015-09-18 07:32:59

标签: sql sql-server sql-view

我有以下情况:

  • 多个数据库视图(大约12个,将来会增加)
  • 每个视图在40到100列之间(每个补丁也会改变)
  • 在其他视图中重复使用的基本视图

创建基本视图以为其他视图共享的列创建单点定义。如果计算列更改值,则此方法很有效,但如果删除或添加列,则无效。 由于我无法使用SELECT * FROM,因为有时会使用两次视图(想想发件人用户和接收者用户的消息视图)。

这种情况正在减缓变成维护噩梦,因为当其中一个基本视图改变时,所有其他视图也必须改变,并且在实践中,一些被遗忘。

当我向基本视图添加列时,有没有办法自动将列添加到所有依赖的视图?如果我可以使用我给视图的别名为列添加前缀,那将是很好的,但我无法做到。如何使这个可维护?

1 个答案:

答案 0 :(得分:3)

您可以在所有观看次数上启用SCHEMABINDING。这不会制造任何东西"自动"但它至少会阻止你忘记更新任何内容:

create table dbo.T1 (ID int not null)
go
create view dbo.V1
with schemabinding
as
    select ID from dbo.T1
go
create view dbo.V2
with schemabinding
as
    select ID from dbo.V1
go
alter view dbo.V1
with schemabinding
as
    select ID,ID+1 as ID2 from dbo.T1

产地:

Msg 3729, Level 16, State 3, Procedure V1, Line 1
Cannot ALTER 'dbo.V1' because it is being referenced by object 'V2'.

在我(暂时)删除V1(以及依赖于它的任何其他视图)之前,我无法更改V2。它还意味着存储依赖关系跟踪元数据,可用于事先查找依赖关系:

select distinct OBJECT_NAME(object_id)
from sys.sql_dependencies
where OBJECT_NAME(referenced_major_id) = 'V1'

产地:

V2