假设我有表 TabA 列:
-
col1 - 主键(但不是标识)
-
col2 - 外键
-
col3 - 具有唯一约束
-
col4 - 带检查约束
-
col5 - 带有NOT NULL约束
此外, TabA 有2个触发器:
-
INSTEAD OF INSERT - 这个取消插入到 TabA (当然),但在它自己的代码中插入新行到 TabA . 此新行中所有列的值保证正确
-
插入后 - 这只是打印字符串
现在,我准备将新行插入 TabA (INSERT INTO TabA VALUES(...)) . 显然,我们不得不期待一些事件:
必须检查col1的
- 值是否唯一,NOT NULL(主键)
必须检查col2的
- 值是否符合父表(外键)
必须检查col3的
- 值的唯一性
必须根据检查约束检查col4的
- 值
必须检查col5的
- 值是否为NOT NULL
必须执行
-
INSTEAD OF触发器
-
必须执行AFTER触发器
我想要的是重新排序此列表(1-7),以便第1个事件发生在第一个事件上,2 =事件将发生在第二个,...和7表示最后一个事件 .
此外,如果事件X产生错误(例如col5 = NULL) - 这是否意味着事件X 1,X 2 ..将发生?1754359?
谢谢你的帮助!
3 回答
通过设置触发器中的print语句所描述的测试表并简单地尝试插入无效值,可以很容易地进行测试 . 这样做给了我
而不是触发器
检查PK的NULL
检查第5列的NULL
检查PK约束的唯一性
检查唯一约束的唯一性
检查第4列的检查约束
检查FK约束
触发后触发
据我所知,1,7和8的顺序是有保证的 . 其余的都是随意的 . 任何错误都将停止后续步骤 .
INSERT,UPDATE,DELETE语句的一般执行顺序:
强制执行所有表级和行级约束 . 请注意,您无法控制检查这些约束的顺序 .
如果正在执行的语句存在INSTEAD OF触发器,请执行它 .
以未定义的顺序执行所有适当的AFTER触发器,但以下情况除外:
如果已将后触发器指定为通过
sp_settriggerorder
执行的第一个或最后一个触发器,则在适当的位置执行这些触发器,其中任何剩余的触发器以未定义的顺序执行 .您可能只有1个INSTEAD OF触发器(每个操作:INSERT,UPDATE或DELETE) . 该触发器将始终在任何AFTER触发器之前执行,因为它在相应的INSERT,UPDATE或DELETE语句中执行 .
永远执行AFTER触发器,奇怪的是,在数据修改语句执行之后 .
NOTE: 如果你有一个INSTEAD OF触发器,我不清楚,在执行INSTEAD OF触发器之前,是否在执行INSTEAD OF触发器时没有花费任何实际的时间来处理INSTEAD OF触发器 . 那是你可能想要尝试的东西 .
当然,我做到了!并且同意你的观点 - 从1到8得到相同的结果 . 对我来说尴尬的是“Microsoft SQL Server 2008 Bible”一书(Paul Nielsen)的引用 . 那是(第637页):
所以,正如你所看到的,这个IT-Pro不同意你和我 . 例如,他给INSTEAD OF触发器4号,而我们给它1号 . 这句话让我感到困惑!