当前位置:首页 > SQL server学习资料
肖老师您好:
我是信管1002班的王艳歌,还是我上次问您的那个问题,如果说现在有一个员工表: 员工编号 部门表如下: 部门编号 部门名称 部门负责人编号 管理表(被管理员,管理者),实际上一个记录中的一个员工是管理者,但在另外一个记录中就有可能是被管理员工,他被他的上级管理 被管理员工(主键) 管理者 要求如下:
员工一定是属于某一个部门,并且员工编号有两部分组成,所在部门号+部门内编号; 部门负责人一定是部门员工,一定存在于员工表中。
管理表中的管理者一定也是公司的某一个员工,除了处于最上层的领导者没有管理者,其他中层管理者有既管理者,也有被管理者。
现在我发现两个问题:
1、SQL Server的表内级联(参照关系与被参照关系是同一关系)是不允许的。例
如管理表(被管理员工,管理者),这样在公司内部管理层实际上是形成了一个树状结构图,这样在删除某一个员工的时候,如果他的下面有他领导的员工,则员工一起删除,修改该员工时,被他所管理的员工的信息也要级联更改。
2、两张表之间互为参照关系时也是不允许的,类似上面的两张表之间会为参照关
系,员工表中的“所在部门号”是部门表的主键,部门表中的“部门负责人编号”是员工表的主键,定义这种外键约束的时候是被拒绝的。
关于第二个互为参照关系时不能设置参照完整性约束,若是在上面定义如下的触
发器:在部门表上建立触发器如下:建立修改部门编号时触发修改员工表中对应部门中的员工编号(因为所在部门号改变了),在员工表上再创建一个修改员工编号时触发部门表中相应负责人的编号修改,这样又引起该部门负责人的编号修改,又引起部门表的修改。这相当于在每张表在上面都建立了一个触发器,但是这是属于循环的触发,SQL SERVER 不允许这样定义,他认为可能会引起死循环,于是我就想可不可以在表上定义列级触发器,但是我查了资料,好像SQL SERVER 2008不支持列级触发器。我于是又想了一种解决方法,在部门号修改时,部门负责人的编号肯定是要修改的,于是我就先修改部门负责人的编号,然后再去员工表中,修改部门员工的编号,以及所在部门号。这样等于说是只在部门表中定义了一个触发器,而能引起两张表都同时修改,可是我觉得我这种解决方案有点牵强,解决此类问题不具有普遍性,想请教一下老师还有没有更好的方法。
关于第一种情况我通过触发器实现了级联删除那个节点下面的所有子节点,但是使用的方法是从别人的论文里面看到的,先查找当前层要删除的节点,存入一个大表(存放所有要删除的节点)然后迭代下一层要删除的节点,依次这样做,知道某一层的节点都不含有子节点则该层就是最下层的了,于是就查找到了以某一个节点为根,它的所有子节点,然后进行删除。
我想这样的关系实际上就是一棵树,于是我类比数据结构里面的树的遍历,可以使用前序遍历的算法,使用一个队列,每次从队列中出对一个队头元素,然后查看他有无子节点,若有将他的子节点入队,若没有,继续从队列中去下一个元素。比如说原来的树结构是:
员工姓名 所在部门号
A1 A2
A4 A5
A8 A9 A1A1 0 1
则从A1开始从左到右所有子节点进队序列为: A11 从这个方向进队 从这个方向出队 A10 A9 A8 A7 A6 A3 A6 A7 A5 A4 A3 A2 A1 这样每次要从队头取出一个元素,然后查看有无子节点,有的话继续从队尾入队,没有的话下一个节点出对,因为这样的话涉及到了表中的某一条记录,要用到游标,但是我写代码的时候发现游标每次移动的时候都是基于不一样查询集合的,有表不是在一个固定的集合上依次向下移动的,于是我就不知道该怎么做了。
老师您能不能给我一点建议呀,我卡在这里两天了,一直都找不到合适的办法,除了别人论文中的那个方法。
共分享92篇相关文档