2014-02-28 46 views
0

夥計們! 我想在一個觸發器中執行多個操作,但它不起作用。 有人可以幫忙嗎? 問題在哪裏? 我的錯誤在哪裏? 請幫忙。一次觸發多次動作,不工作

DROP TRIGGER IF EXISTS `usertrigger` ; 

CREATE DEFINER = `cmsbalti`@`localhost` TRIGGER `usertrigger` 
    BEFORE DELETE ON `users`   
    FOR EACH ROW 
    INSERT INTO `del_users` (fullname) 
    VALUES (old.fullname) 

BEFORE INSERT ON `del_users` FOR EACH ROW 
BEGIN 
    DELETE FROM `gallery` 
    WHERE uid = old.id; 
END 

謝謝。

+0

的第一件事是第一:你想要什麼在觸發你的行動做以及何時做你想讓你的觸發器運行? –

回答

0

作爲解決方法,我不會使用觸發器!只是改變你的設計並添加一個約束,所以只需要一個動作,因爲約束會完成其餘的動作。請查看link瞭解更多詳情。


至於觸發選項

只有一個動作觸發是可能的。 爲了便於理解看到例如:

mysql> CREATE TABLE actor(
    actor_id SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT, 
    first_name VARCHAR(45) NOT NULL, 
    last_name VARCHAR(45) NOT NULL, 
    last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (actor_id), 
    INDEX idx_actor_last_name (last_name) 
); 

創建第一個觸發器:

mysql> DELIMITER $$ 
mysql> 
mysql> CREATE TRIGGER trigger1 
    -> AFTER INSERT 
    -> ON actor 
    -> FOR EACH ROW 
    -> BEGIN 
    -> -- code 
    -> END 
    -> $$ 
Query OK, 0 rows affected (0.00 sec) 

創建第二個觸發:

mysql> CREATE TRIGGER trigger2 
    -> AFTER UPDATE 
    -> ON actor 
    -> FOR EACH ROW 
    -> BEGIN 
    -> -- code 
    -> END 
    -> $$ 
Query OK, 0 rows affected (0.00 sec) 

創建日稅務局行動TRIGER:

mysql> CREATE TRIGGER trigger3 
    -> AFTER DELETE 
    -> ON actor 
    -> FOR EACH ROW 
    -> BEGIN 
    -> -- code 
    -> END 
    -> $$ 
DELIMITER ;Query OK, 0 rows affected (0.01 sec) 

現在,讓我們嘗試創建一個堡壘觸發以相同的動作作爲第一個觸發

mysql> CREATE TRIGGER trigger11 
    -> AFTER INSERT 
    -> ON actor 
    -> FOR EACH ROW 
    -> BEGIN 
    -> -- code 
    -> END 
    -> $$ 
ERROR 1235 (42000): This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table' 

所以結束的故事 - 你不能創建觸發器的方式你已經寫了它 - 作爲兩個不同的觸發器,因爲它們是不同的。

所以我的建議是在該表上創建兩個觸發器,並確保將它們放在塊中以避免執行級別的問題(機率很小)。

0
  1. 不要分散跨多個觸發器刪除用戶的邏輯。這將使它難以維持。
  2. 只需在您的DELETE觸發器中使用BEGIN ... END塊,並在del_users中插入審計記錄並從gallery刪除相關記錄。 不要忘記在mysql客戶端中更改DELIMITER
  3. 如果您使用的是外鍵約束,您必須爲觸發器選擇爲BEFORE事件,因爲您必須在刪除父項之前刪除子記錄。

話雖這麼說,你的觸發可能看起來像

DELIMITER // 
CREATE TRIGGER tg_ad_users 
BEFORE DELETE ON users 
FOR EACH ROW 
BEGIN 
    INSERT INTO del_users (user_id, fullname, deleted) 
    VALUES (OLD.id, OLD.fullname, NOW()); 
    DELETE FROM gallery 
    WHERE uid = OLD.id; 
END// 
DELIMITER ; 

這裏是SQLFiddle演示