sys.sql_dependencies目录视图未更新的后果是什么

时间:2010-09-15 12:39:11

标签: sql sql-server sql-server-2005

如果我有两个简单的存储过程,就像这样创建:

create procedure root as
select 1 
go

create procedure dependant as
exec root
go

dependant取决于root)。

当我检查sys.sql_dependencies表中的第二个程序时,我看到一个条目(正如我所料)。

但是,如果我首先添加dependant程序,则会收到以下警告。

  

无法添加行   sys.sql_dependencies用于存储   程序因为它取决于   缺少表'root'。存储的   程序仍将创建;   但是,它不能成功   执行直到表存在。

而且,exec dependant;失败了。

因此,当我添加root过程时,exec dependant;有效,但sys.sql_dependencies上没有记录任何依赖关系。

我的问题有两个:

  1. 这有什么后果?
  2. 一切似乎都非常可以接受,所以SQL为什么不回溯添加这条记录呢?
  3. 帮助,一如既往地非常感谢。

1 个答案:

答案 0 :(得分:4)

后果只是当您重构数据库时,识别受影响的对象会更加困难。

您可以通过编写脚本来在所有数据库对象上运行sp_refreshsqlmodule来刷新所有依赖项。

在SQL Server 2008中,仍然存储此类未解析的依赖项,并且可以通过sys.sql_expression_dependencies访问这些依赖项,这意味着依赖项信息更可靠。

SQL Server 2008的行为如下。

创建依赖后但在root存在之前

SELECT     OBJECT_NAME(referencing_id) AS Name, 
           referencing_class_desc, 
           referenced_class_desc, 
           referenced_entity_name, 
           referenced_id, 
           is_caller_dependent, 
           is_ambiguous
FROM         sys.sql_expression_dependencies

返回

Name       referenced_entity_name    referenced_id is_caller_dependent is_ambiguous
---------- ------------------------- ------------- ------------------- ------------
dependant  root                      NULL          1                   0

在您的示例代码中,这也是创建root后查询的结果,因为对它的引用不是模式限定的,因此依赖于调用者。但是,如果您的dependant程序的定义更改为

create procedure dependant as
exec dbo.root

然后创建dbo.root后,将返回以下内容

Name       referenced_entity_name    referenced_id is_caller_dependent is_ambiguous
---------- ------------------------- ------------- ------------------- ------------
dependant  root                      2121058592    0                   0