如果我有两个简单的存储过程,就像这样创建:
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
上没有记录任何依赖关系。
我的问题有两个:
帮助,一如既往地非常感谢。
答案 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