sql – INSTEAD OF触发器和CASCADE路径

假设我在层次结构中有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名称来记录代码生成器的指令.

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

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

相关文章

本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的...
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中...
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册...
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看...