首页 文章

T-SQL和事务流 - 从头到尾

提问于
浏览
0

假设我有表 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 回答

  • 0

    通过设置触发器中的print语句所描述的测试表并简单地尝试插入无效值,可以很容易地进行测试 . 这样做给了我

    • 而不是触发器

    • 检查PK的NULL

    • 检查第5列的NULL

    • 检查PK约束的唯一性

    • 检查唯一约束的唯一性

    • 检查第4列的检查约束

    • 检查FK约束

    • 触发后触发

    据我所知,1,7和8的顺序是有保证的 . 其余的都是随意的 . 任何错误都将停止后续步骤 .

  • 0

    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触发器 . 那是你可能想要尝试的东西 .

  • 0

    通过设置触发器中的print语句所描述的测试表并简单地尝试插入无效值,可以轻松进行测试 .

    当然,我做到了!并且同意你的观点 - 从1到8得到相同的结果 . 对我来说尴尬的是“Microsoft SQL Server 2008 Bible”一书(Paul Nielsen)的引用 . 那是(第637页):

    每个事务按以下顺序遍历各种检查和代码:IDENTITY INSERT check Nullability约束数据类型检查INSTEAD OF触发器执行 . 如果存在INSTEAD OF触发器,则DML的执行在此处停止 . INSTEAD OF触发器不是递归的 . 因此,如果INSERT触发器执行另一个DML命令,则第二次将忽略INSTEAD OF触发器(本章稍后将介绍递归触发器) . 主键约束检查约束外键约束DML执行和更新到事务日志AFTER触发器执行提交事务

    所以,正如你所看到的,这个IT-Pro不同意你和我 . 例如,他给INSTEAD OF触发器4号,而我们给它1号 . 这句话让我感到困惑!

相关问题