2011-08-19 58 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