关于触发器

触发器的嵌套与递归

触发器嵌套指的是一个触发器的操作启动了其他触发器。DBMS 允许触发器嵌套,但对嵌套的层数做出了限制。以 MS SQL Server 为例,其限制触发器最大的嵌套层数为 32 层,即最多连续触发 32 个触发器。当触发器的嵌套数量超过 32 时,最后一个触发器将会启动失败,而整个嵌套操作连同启动第一个触发器的操作将会被回滚。

触发器递归指的是一个触发器的操作启动了自身,或启动了其他触发器而后又启动了自身形成闭环。称前者为直接递归,后者为间接递归。DBMS 会对触发器直接递归做出限制:如 MS SQL Server 中直接递归的触发器只会被执行一次;而 MySQL 中则直接限制在触发器中对当前表进行操作,防止形成直接递归。而间接递归触发器则会被 DBMS 当作触发器嵌套处理,如果没有做特殊处理,按照嵌套数量最大时的处理规则,间接递归触发器及启动第一个触发器的操作都不会生效。

例子

结构及数据:

  Table1          Table2
+---------+ +---------+
| Col | | Col |
+---------+ +---------+
| 0 | | 0 |
+---------+ +---------+

触发器:

Trigger1: ON Table1 AFTER UPDATE
UPDATE Table2 SET Col = Col + 1
Trigger2: ON Table2 AFTER UPDATE
UPDATE Table1 SET Col = Col + 1

SQL 语句:

UPDATE Table1 SET Col = Col + 1

结果:

[SQL Server]Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).

Table1 Table2 中的数据未发生变化

触发器使用的注意事项

  • 每个数据库操作只能启动一次触发器
  • 只在必要的时候使用触发器