T-SQL和事务流-从第一个到最后一个
假设我有一个带有列的tableTabA:T-SQL和事务流-从第一个到最后一个,sql,sql-server,tsql,transactions,Sql,Sql Server,Tsql,Transactions,假设我有一个带有列的tableTabA: col1-主键(但不是标识) col2-外键 col3-具有唯一约束 col4-带检查约束 col5-具有非空约束 另外,TabA有两个触发器: 而不是INSERT-这一个取消了插入到TabA(当然),但是在它自己的代码中,将新行插入到TabA。保证新行中所有列的值都正确 插入后-这一个只是打印字符串 现在,我已经准备好将新行插入TabA(插入TabA值(…)。显然,我们必须预料到一些事件: 必须检查col1的值的唯一性且不为NULL(主键) 必
- col1-主键(但不是标识)
- col2-外键
- col3-具有唯一约束
- col4-带检查约束
- col5-具有非空约束
- 而不是INSERT-这一个取消了插入到TabA(当然),但是在它自己的代码中,将新行插入到TabA。保证新行中所有列的值都正确
- 插入后-这一个只是打印字符串
谢谢你的帮助 插入、更新、删除语句的一般执行顺序:
- 强制执行所有表级和行级约束。请注意,您对检查这些约束的顺序没有控制权
- 如果正在执行的语句存在INSTEAD OF触发器,请执行它
- 以未定义的顺序执行所有适当的AFTER触发器,但以下情况除外:
- 如果after触发器被指定为通过
执行的第一个或最后一个触发器,则在适当的点执行这些触发器,剩余的触发器按未定义的顺序执行sp_settriggerorder
- 如果after触发器被指定为通过
注意:如果您有一个INSTEAD OF触发器,我就不清楚了,因为我没有花太多时间在INSTEAD OF触发器上,也不清楚在执行INSTEAD OF触发器之前是否执行了表/行约束。这是您可能想要尝试的东西。通过设置测试表(如触发器中的print语句所述)并简单地尝试插入无效值,可以很容易地进行测试。这样做给了我很大的帮助
这很容易通过设置测试表进行测试,如print所述 语句,并尝试插入无效值 当然,我做到了!并且同意你的观点-从1到8得到相同的结果。而令我尴尬的是引用了《微软SQL Server 2008圣经》(Paul Nielsen著)一书中的话。即(第637页): 每一笔交易都会通过 顺序如下:
所以,正如你所看到的,这个IT专业人士不同意你和我。例如,他给出的触发器编号为4,而我们给出的触发器编号为1。这句话让我很困惑 这与我在实验中发现的顺序不同。
代替触发器
消息即使违反了约束也会被打印出来,并出现在任何约束错误消息之前。正如我所说:没有对代替触发器进行过太多的研究,它们如何与表/行级约束交互对我来说是个谜。听起来您的INSTEAD OF触发器实际上是对表进行插入的,这会导致触发表/行级别的约束,因此表/行级别的约束与表上的物理插入/更新/删除操作相关联。是。但你刚才让我检查了一些东西。使用代码<代码>打印“而不是触发器”;插入到选项卡中,从插入中选择*;打印“而不是触发器2”代码>第二条消息出现在after Trigger
消息的末尾,因此基本上,整个事件好像在的子范围内运行,而不是在Trigger中运行。