获得当前数据库中对象的依赖关系的算法

create function udf_GenLevelPath_Table()
?returns @v_Result table (LevelPath int,OName sysname,type varchar(8))
/****************************************************************/
/*?功能描述:按照依赖关系,列出数据库对象????????????????????????????????????????????? ?*/
/*?输入参数:无?????????????????????????????????????????????????????????????????????????????????????????????????? */
/*?输出参数:按照依赖关系排列的数据库对象表,无依赖的在前?????????????? */
/*?编??????? 写:我????????????????????????????????????????????????????????????????????????????????????????????????? ?*/
/*?时间:2003-9-9??????????????????????????????????????????????????????????????????????????????????????????????? */
/****************************************************************/

as
begin
?declare @vt_ObjDepPath table (LevelPath int,OName sysname null, type Varchar(8))
?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,type)
??select @vi_LevelPath,o.name,o.type
???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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现数据库系统函数依赖属性闭包的算法,可以使用Python编程语言。以下是一种可能的算法实现: ```python # 定义函数依赖类 class FunctionalDependency: def __init__(self, lhs, rhs): self.lhs = lhs self.rhs = rhs # 计算属性的闭包 def compute_closure(attributes, functional_dependencies): closure = set(attributes) # 初始化闭包为属性集合 closure_changed = True while closure_changed: closure_changed = False for fd in functional_dependencies: if fd.lhs.issubset(closure) and not fd.rhs.issubset(closure): closure = closure.union(fd.rhs) closure_changed = True # 闭包发生变化 return closure # 测试示例 attributes = {'A', 'B', 'C', 'D'} functional_dependencies = [ FunctionalDependency({'A'}, {'B'}), FunctionalDependency({'A'}, {'C'}), FunctionalDependency({'C', 'D'}, {'A', 'B'}) ] closure = compute_closure(attributes, functional_dependencies) print("属性的闭包为:", closure) ``` 以上代码定义了一个`FunctionalDependency`类来表示函数依赖,并实现了`compute_closure`函数来计算属性的闭包。在测试示例,我们定义了一些属性和函数依赖,并调用`compute_closure`函数来计算属性的闭包。最后,打印输出结果。 算法实现的思路是通过迭代的方式,不断查找闭包是否有新的属性加入。首先,将闭包初始化为属性集合。然后,对每个函数依赖进行判断,如果函数依赖的左侧属性是闭包的子集并且右侧属性不是闭包的子集,则将右侧属性加入闭包,并标记闭包发生变化。循环迭代,直到闭包不再发生变化为止。最后,返回计算得到的闭包。 以上就是一个可能的Python实现算法,可能还有其他实现方式,具体实现可以根据实际需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值