加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer中的对象依赖关系处理

发布时间:2020-12-12 15:48:23 所属栏目:MsSql教程 来源:网络整理
导读:SqlServer 中的对象依赖关系处理 ? 1 、 sp_depends 查找表的依奈项 例 1 : sp_depends 'tblItem' 注意:直接使用 sp_depends 来查看依赖性,是不可靠的。 我们可能需要进一步用脚本的方式来实现查找,但在以下情况这种方法会失效: ????? 1. 存储过程是加

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读