【IT168技术文档】
在sql server 中我们会通过邮件菜单来查看一个对象的依赖关系,但有些意外情况会造成查看结果并不是非常的准确!
可以尝试以下例子 :
第一步:颠倒顺序,创建一个缺失依赖关系的存储过程 ;
1
CREATE PROC dbo.TestRefresh1
2
as
3
EXEC dbo.TestRefresh2
4
EXEC dbo.TestRefresh3
5
EXEC dbo.TestRefresh4
6
EXEC dbo.TestRefresh5
7
EXEC dbo.TestRefresh6
8
9
GO
10
11
CREATE PROC dbo.TestRefresh2
12
AS SELECT 1
13
GO
14
15
CREATE PROC dbo.TestRefresh3
16
AS SELECT 1
17
GO
18
19
CREATE PROC dbo.TestRefresh4
20
AS SELECT 1
21
CREATE PROC dbo.TestRefresh12
as 3
EXEC dbo.TestRefresh24
EXEC dbo.TestRefresh35
EXEC dbo.TestRefresh46
EXEC dbo.TestRefresh57
EXEC dbo.TestRefresh68

9
GO 10

11
CREATE PROC dbo.TestRefresh212
AS SELECT 1 13
GO14

15
CREATE PROC dbo.TestRefresh316
AS SELECT 1 17
GO 18

19
CREATE PROC dbo.TestRefresh420
AS SELECT 1 21


第二步: 查看一下这个存储过程的依赖关系
EXEC sp_depends @objname = N'dbo.TestRefresh1'
在结果中并没有发现dbo.TestRefresh1同其他对象有任何的依赖关系 ,细心的朋友早就发现这个问题是因为创建存储过程时的顺序问题所致。假设我们的数据库中并不缺失相关对象,可以尝试用如下代码来更新他们的依赖关系:
declare @cmd as nvarchar(max);
declare c cursor fast_forward for
select 'EXEC sys.sp_refreshsqlmodule ' + ''''+schema_name([schema_id])+'.'+ [Name]+'''' as cms from sys.objects where type='p'
open c
fetch next from c into @cmd ;
while @@fetch_status = 0
begin
exec(@cmd);
fetch next from c into @cmd;
end
close c;
deallocate c;
declare c cursor fast_forward for
select 'EXEC sys.sp_refreshsqlmodule ' + ''''+schema_name([schema_id])+'.'+ [Name]+'''' as cms from sys.objects where type='p'
open c
fetch next from c into @cmd ;
while @@fetch_status = 0
begin
exec(@cmd);
fetch next from c into @cmd;
end
close c;
deallocate c;
完成之后再次执行
EXEC sp_depends @objname = N'dbo.TestRefresh1'
看看结果吧!
其实,针对这些特性,我们可以用上面这段脚本来检查生产数据库数据库存储过程的健康状况,发现缺失的依赖关系!虽然用处不大,毕竟是一个知识点。与大家分享