SqlServer中的对象依赖关系处理

SqlServer中的对象依赖关系处理

 
1sp_depends

查找表的依奈项

1sp_depends 'tblItem'

注意:直接使用sp_depends来查看依赖性,是不可靠的。

我们可能需要进一步用脚本的方式来实现查找,但在以下情况这种方法会失效:

      1. 存储过程是加密的。

      2. 存储过程的注释代码中包含它所依赖的对像名字。

      3. 存储过程的代码过长,它所依赖的对像的名字恰好被分割存储在 syscomments 的两行中。


--------------------------------------------------------------------------------
-- for sql server 2000
--------------------------------------------------------------------------------
declare @procedure_name nvarchar(255)
    set @procedure_name = N'CustOrderHist'

select distinct
       procedure_name  = object_name(c.id)
      ,table_name      = t.name
  from dbo.syscomments c
          inner join (select name from dbo.sysobjects where xtype='U') t
    on (   c.text like '% '   + t.name  + ' %'
        or c.text like '%.'   + t.name  + ' %'
        or c.text like '% ![' + t.name  + '!] %' escape '!'
        or c.text like '%.![' + t.name  + '!] %' escape '!'
       )
where c.id = object_id(@procedure_name)


--------------------------------------------------------------------------------
-- for sql server 2005
--------------------------------------------------------------------------------
declare @procedure_name nvarchar(255)
    set @procedure_name = N'CustOrderHist'

select distinct
       procedure_name  = object_name(c.id)
      ,table_name      = t.name
  from sys.syscomments c
          inner join sys.tables t
    on (   c.text like '% '   + t.name  + ' %'
        or c.text like '%.'   + t.name  + ' %'
        or c.text like '% ![' + t.name  + '!] %' escape '!'
        or c.text like '%.![' + t.name  + '!] %' escape '!'
       )
where c.id = object_id(@procedure_name)

 


2、取得当前数据库中对象的依赖关系
作用:如果对一个数据的依赖关系不清楚,可以用这个函数分析一下。

create   function   udf_GenLevelPath()  
  returns   @v_Result   table   (LevelPath   int,OName   sysname)  
  /****************************************************************/  
  /*
功能描述:按照依赖关系,列出数据库对象 */  
  /*
输入参数:无
*/  
  /*
输出参数:按照依赖关系排列的数据库对象表,无依赖的在前
*/  
  /*
编写:我
*/  
  /*
时间:2003-9-9
*/  
  /****************************************************************/  
  as  
  begin  
  declare   @vt_ObjDepPath   table   (LevelPath   int,OName   sysname   null)  
  declare   @vt_Temp1   table   (OName   sysname   null)  
  declare   @vt_Temp2   table   (OName   sysname   null)  
  --
依赖的级别,值越小依赖性越强

  declare   @vi_LevelPath   int  
   
  set   @vi_LevelPath   =   1  
  --
得到所有对象,不包括系统对象          
  insert   into   @vt_ObjDepPath(LevelPath,OName)  
  select   @vi_LevelPath,o.name  
  from   sysobjects   o  
  where   xtype   not   in   ('S','X')  
   
  --
得到依赖对象的名称
  
  insert   into   @vt_Temp1(OName)  
  select   distinct   object_name(sysdepends.depid)    
  from   sysdepends,@vt_ObjDepPath   p  
  where   sysdepends.id   <>   sysdepends.depid  
  and   p.OName   =   object_name(sysdepends.id)  
   
  --
循环处理:由对象而得到其依赖对象
  
  while   (select   count(*)   from   @vt_Temp1)   >   0  
  begin  
  set   @vi_LevelPath   =   @vi_LevelPath   +   1  
   
  update   @vt_ObjDepPath  
  set   LevelPath   =   @vi_LevelPath  
  where   OName   in   (select   OName   from   @vt_Temp1)  
  and   LevelPath   =   @vi_LevelPath   -   1  
   
  delete   from   @vt_Temp2  
   
  insert   into   @vt_Temp2  
  select   *   from   @vt_Temp1  
   
  delete   from   @vt_Temp1  
   
  insert   into   @vt_Temp1(OName)  
  select   distinct   object_name(sysdepends.depid)    
  from   sysdepends,@vt_Temp2   t2  
  where   t2.OName   =   object_name(sysdepends.id)  
  and   sysdepends.id   <>   sysdepends.depid  
   
  end  
   
  select   @vi_LevelPath   =   max(LevelPath)   from   @vt_ObjDepPath  
   
  --
修改没有依赖对象的对象级别为最大
  
  update   @vt_ObjDepPath  
  set   LevelPath   =   @vi_LevelPath   +   1  
  where   OName   not   in   (select   distinct   object_name(sysdepends.id)   from   sysdepends)  
  and   LevelPath   =   1  
   
  insert   into   @v_Result  
  select   *   from   @vt_ObjDepPath   order   by   LevelPath   desc  
  return  
  end  
  go  
   
  --
调用方法
  
  select   *   from   dbo.udf_GenLevelPath()  
  go  


参考:http://topic.csdn.net/t/20030911/14/2248894.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值