2011-08-19 85 views
1

我有一个普通的AFTER UPDATE触发器来检查我的用户表是否已经更改了列,如果是,请调用存储过程。MYSQL触发器递归规避

问题是存储过程做了一些计算并自己更新了用户中的字段。

如果我的存储过程更新了调用触发器的用户表,它将再次调用存储过程,我该如何避免递归?

谢谢!

+0

想知道mysql允许它:-S – zerkms

回答

1

MySQL不会让您禁用触发器(不删除和重建它们),但你有两个选择:

  1. 不要从程序内更新用户表。
  2. 向用户添加一个字段,该程序将在更新时设置为特定值。当触发器看到该字段的值时,不要调用该过程。
  3. 使用全局变量来完成上述操作(NOT connection safe - 将禁用所有连接的触发器)。
+0

对于#3,最好使用会话变量(即'@ var'而不是'@@ var')。你甚至可以使用它,当它检测到发生递归时关闭(即,在触发器和proc中,保护'IF IFNULL(@unique_recurse_var,0)= 0中的潜在递归代码THEN SET @unique_recurse_var = 1; <做保护操作>; ELSE SET @unique_recurse_var = 0; END IF;')。你可能想要单位测试,以确保功能永远不会中断。 – CSTobey