sp_depends不太安全

Posted on 2011-11-28 21:46  andera  阅读(437)  评论(0)    收藏  举报
--在SQL Server中,经常会用到sp_depends 'sp_name'来查看某个对象被其他调用(或引用)的关系,这个非常方便
--但其实不太保险。
-------------------------------------------------------------------------------------------
--示例1(可以复制以下语句在查询分析器中试验):

--创建存储过程,里面调用另一个存储过程,但被调用的存储过程未被创建
create procedure UseOthers
as
begin
exec UseMe 'a'--暂时不存在UseMe这个存储过程
end

--查看引用--结果
sp_depends UseOthers--Object does not reference any object, and no objects reference it.
sp_depends UseMe--error:The object 'UseMe' does not exist in database 'test' or is invalid for this operation.

--之后补充这个被调用的存储过程
create procedure UseMe
@flag nvarchar(50)
as
begin
select @flag
end

--查看引用--结果
sp_depends UseOthers--Object does not reference any object, and no objects reference it.
sp_depends UseMe--Object does not reference any object, and no objects reference it.

--可见sp_depends不支持后面补充的引用依赖
--(通过手工界面操作查看View Dependencis也是看不到后面补充的引用依赖)
--这里演示了存储过程的调用,其他对象的引用也是一样的,比如函数,表等

--drop procedure UseOthers
--drop procedure UseMe
-------------------------------------------------------------------------------------------

--场景2:
--创建存储过程
create procedure UseMe
@flag nvarchar(50)
as
begin
select @flag
end

--创建存储过程,里面通过字符串动态调用另一个存储过程
create procedure UseOthers
as
begin
declare @sql nvarchar(4000)
set @sql='UseMe ''a'''--这里用到了另一个存储过程
exec(@sql)--动态调用
end

--查看引用--结果
sp_depends UseOthers--Object does not reference any object, and no objects reference it.
sp_depends UseMe--Object does not reference any object, and no objects reference it.

--可见sp_depends不支持动态创建(或运行时)的引用依赖
--(通过手工界面操作查看View Dependencis也是看不到动态创建(或运行时)的引用依赖)
--这里演示了存储过程的调用,其他对象的引用也是一样的,比如函数,表等

--drop procedure UseOthers
--drop procedure UseMe

 

 

--总结1:sp_depends不能查看到后来补充的引用依赖
--总结2:sp_depends不支持动态创建(或运行时)的引用依赖

 

--所以,仅仅通过这种方式来断定依赖关系,是不安全的。

 

 

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3