Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个SQL视图,单点定义,如何?_Sql_Sql Server_Sql View - Fatal编程技术网

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

多个SQL视图,单点定义,如何?,sql,sql-server,sql-view,Sql,Sql Server,Sql View,我有以下情况: 多个数据库视图(大约12个,将来还会增加) 每个视图在40~100列之间(每个面片也会改变) 在其他视图中重用的基础视图 创建基础视图是为了为其他视图共享的列创建一个定义点。如果计算列更改了值,则此操作非常有效,但如果删除或添加列,则此操作无效。 因为我不能使用SELECT*FROM,因为有时候视图会被使用两次(想想邮件视图中的发送方用户和接收方用户) 这种情况正在慢慢演变为维护噩梦,因为当一个基本视图更改时,所有其他视图也必须更改,并且在实践中,一些视图被遗忘 当我向基础视

我有以下情况:

  • 多个数据库视图(大约12个,将来还会增加)
  • 每个视图在40~100列之间(每个面片也会改变)
  • 在其他视图中重用的基础视图
创建基础视图是为了为其他视图共享的列创建一个定义点。如果计算列更改了值,则此操作非常有效,但如果删除或添加列,则此操作无效。 因为我不能使用
SELECT*FROM
,因为有时候视图会被使用两次(想想邮件视图中的发送方用户和接收方用户)

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

当我向基础视图添加列时,是否有一种方法可以自动向所有依赖视图添加列?如果我可以在列前面加上我给视图的别名,那就太好了,但我不能。如何使其可维护?

您可以打开所有视图。这不会使任何内容“自动”,但至少可以防止您忘记更新任何内容:

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'.
V2
在(临时)删除
V2
(以及依赖它的任何其他视图)之前,我无法更改
V1
。这还意味着存储了依赖项跟踪元数据,可用于提前查找依赖项:

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

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

这会惹恼程序员,但至少可以防止错误+1但不会将其标记为已接受,也许有人有另一个想法。还可以通过
对象定义
找到依赖项。但它仍然需要编辑视图的人了解并使用它。