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

sql – INSTEAD OF触发器和CASCADE路径

发布时间:2020-12-12 08:47:54 所属栏目:MsSql教程 来源:网络整理
导读:假设我在层次结构中有3个表: TableA - TableB - TableC TableC与TableB有外键关系,TableB与TableA有外键关系. 如果我删除了表A中的一个记录,它应该通过层次结构级联删除.使用ON DELETE CASCADE可以正常工作. 但是我们需要在T??ableC上放置一个INSTEAD OF触发
假设我在层次结构中有3个表:
TableA -> TableB -> TableC

TableC与TableB有外键关系,TableB与TableA有外键关系.

如果我删除了表A中的一个记录,它应该通过层次结构级联删除.使用ON DELETE CASCADE可以正常工作.

但是我们需要在T??ableC上放置一个INSTEAD OF触发器.我的理解是,INSTEAD OF触发器不能放在具有删除级联的表上.取自MSDN:

For INSTEAD OF triggers,the DELETE option is not allowed on tables that have a referential relationship specifying a cascade action ON DELETE.

如果我必须在TableB-> TableC之间进行级联删除,我将需要使用INSTEAD OF触发器来强制引用完整性,然后与TableB-> TableA有相同的问题.这是一个简单的例子,但是想象一下级联路径要大得多.看起来它可以很容易地在一个漫长的瀑布路径上滚雪球.

那么处理这种情况的最佳做法是什么?

解决方法

假设您必须使用INSTEAD OF触发器,并且AFTER触发器不是一个选项,最好的方法是a)严格控制模式,以便您可以b)以常规方式脚本化INSTEAD OF触发器以实现CASCADE DELETE和任何你需要的其他操作

像以前一样创建FK约束,但是没有任何级联行为.在FK名称中,使用一些惯例来指出什么样的级联行为和自定义行为应该发生,例如:

> FK_UC_DC_Table1_Table2 – 更新级联,删除级联
> FK_UC_DN_Table1_Table3 – 更新级联,删除集合

使用任何有意义的东西,但创建FK,它们是代码生成的有用的元数据,您可以使用FK名称来记录代码生成器的指令.

然后,我会进一步,并在自己的模式中隔离这些表.它们的行为方式与其他表格不同,在测试和微调代码生成时,它们首先会更加错误.最好保留所有这些隔离,并且容易被一个普通容器识别.

专用模式还将通知任何人修改不同规则和行为的数据.

(编辑:李大同)

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

    推荐文章
      热点阅读