一个窝火的 相关性问题(也是一个打包的问题,希望高手指点)

Oldman 2004-09-20 11:34:18
在SQLSERVER下,有相关性这个东西,相关性的信息系统说是存在SysDepends这个系统表下,
我现在有三个存储过程 SP1、SP2、SP3 调用关系是SP1调用了SP2,SP2调用了SP3
现在我查看SysDepends这个表里的相关性信息,显示是对的,SP1的相关性信息里面说他与SP2是相关的, 但是当我将SP2改了下内容,然后去查看SysDepends下面的信息,发现,现在SP1的相关性信息里面已经没有SP2的信息了,我可是在SP1下调用了SP2的啊!!!

我现在需要将数据库中的SP、VIEW、FUN等的脚本导出,然后到另外一台服务器上去执行,现在这个相关性把我搞死了,因为SysDepends这个表里面有好多相关性信息都没有。 我导出脚本时,这些物件的先后顺序是很重要的,要不然到了要安装的机器上就无法运行脚本(前面的脚本调用后面脚本生成的物件,肯定会报错)!!

我想得到SQL下各物件之间相关性的准确信息!

请问题有什么办法能解决此问题?
或者有什么方式使运行创建脚本时,不检查错误也行。
如果使用在一台测试机上运行,然后手工调整的话,我看会把人累死的!!

我在这里先谢谢各位了!
...全文
231 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Oldman 2005-01-11
  • 打赏
  • 举报
回复
各位再看看吗
davorsuker39 2004-11-17
  • 打赏
  • 举报
回复
学习!!!!!
davorsuker39 2004-11-10
  • 打赏
  • 举报
回复
学习!!!!!
laoQ 2004-11-08
  • 打赏
  • 举报
回复
学习中……
帮楼主UP
Oldman 2004-09-24
  • 打赏
  • 举报
回复
↑↑↑
Oldman 2004-09-23
  • 打赏
  • 举报
回复
↑↑
yuFei 2004-09-21
  • 打赏
  • 举报
回复
toup
Oldman 2004-09-21
  • 打赏
  • 举报
回复
Oldman 2004-09-21
  • 打赏
  • 举报
回复
现在找到了一个能解决VIEW顺序的方法,就是使用sp_refreshview @viewName 一个个去把sysdepends里面的顺序更正,将更正信息写到临时表,就能得到准确的view的相关性信息。

现在还是有问题,FUNCTION和TRIGGER的正确相关性无法得到?
Oldman 2004-09-20
  • 打赏
  • 举报
回复
首先谢谢邹老大的指教,
但我建VIEW和FUN时,就必须有严格的顺序关系!!
所以我还是必须得到严格的顺序关系的。
zjcxc 2004-09-20
  • 打赏
  • 举报
回复
要强调顺序的是(应该还有其他)

主键表必须在外键表前建立
基表必须在相关视图/索引/约束等前建立


你用sql的生成脚本功能就行了,不必须一定强调某种顺序
zjcxc 2004-09-20
  • 打赏
  • 举报
回复
其次,存储过程的创建顺序并不影响使用

即存储过程A调用B,存储过程B调用存储过程C

A,B,C这三个存储过程谁先建立都是一样的,建立也不会出错,顺序不对,仅仅是有个警告而已.
zjcxc 2004-09-20
  • 打赏
  • 举报
回复
主  题: 抛砖引玉--获得当前数据库中对象的依赖关系的算法
作  者: tjan (安安)



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


27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧