2012-10-04 41 views
0

我有這個觸發器在MySQL簡單觸發器投擲的錯誤,並停止執行

DROP TRIGGER IF EXISTS BeforeGivingRight; 
DELIMITER $$ 
CREATE TRIGGER BeforeGivingRight 
BEFORE INSERT ON right_code 
FOR EACH ROW 
BEGIN 
    DECLARE num_rows INT NULL; 
    SELECT count(right_code) FROM valid_rights WHERE right_code = 
              new.user_right.right INTO num_rows; 

    IF num_rows = 0 
    THEN 
     set msg = concat('Error: That right is not allowed!', 
             cast(new.user_right.right as char)); 
     signal sqlstate '45000' set message_text = msg; 
    END IF; 
END $$ 
DELIMITER ; 

及其給我這個錯誤

#1064 - You have an error in your SQL syntax; check the manual that corresponds 
    to your MySQL server version for the right syntax to use near 'NULL; SELECT 
    count(right_code) FROM valid_rights WHERE right_code = new.user_' at line 5 

這裏有什麼問題?我想要做的是,在插入一些權利(例如201)之前,使用觸發器檢查valid_rights是否存在。

EDIT(回答)

所以,當你想要的trows異常觸發您使用此:

DROP TRIGGER IF EXISTS BeforeGivingRight; 
DELIMITER $$ 
CREATE TRIGGER BeforeGivingRight 
BEFORE INSERT ON user_rights 
FOR EACH ROW 
BEGIN 
    DECLARE num_rows INT DEFAULT NULL; 
    DECLARE msg VARCHAR(32) DEFAULT ""; 
    SELECT count(valid_rights.right_code) FROM valid_rights WHERE right_code = new.right INTO num_rows; 

    IF num_rows = 0 
    THEN 
     set msg = concat('Error: That right is not allowed!', cast(new.right as char)); 
     signal sqlstate '45000' set message_text = msg; 
    END IF; 
END $$ 
DELIMITER ; 
+1

而不是編輯,你爲什麼不張貼與你的研究信息的新的答案,並選擇它作爲正確答案。 – manas

回答

1

你錯過了關鍵字DEFAULT。使用0而不是NULL

DECLARE total_sale INT DEFAULT 0; 

See HERE: Variables in Stored Procedures

+0

這是我的意識...但嚴重的是,爲什麼它告訴我關於LINE 5和'SELECT count(right_code)FROM valid_rights WHERE right_code = new.user_' witch is on line 8?它讓我的腦袋變得狂野...... – Empeus

+0

@Empeus回答你關於行號的問題,老實說我不知道​​。如果我看到生成的錯誤,我只會發現'......正確的語法在...附近使用,而不是行號。 hehe –

+0

@Epepeus很好,很顯然,錯誤消息指出'...爲正確的語法使用附近'NULL; ...',嗯,'NULL'當然是在前面的行.. – manas

0

作爲一個解決方法:如果表是InnoDB的,那麼你可以使用外鍵約束不存在的值。只需在user_rights表中添加外鍵,服務器就會引發錯誤。

例如 -

ALTER TABLE right_code 
    ADD CONSTRAINT FK_right_code FOREIGN KEY (`right`) 
    REFERENCES valid_rights(right_code) ON DELETE RESTRICT ON UPDATE RESTRICT; 

此外,使字段valid_rights。如果不是,則爲right_code

+0

這是一種可能性,謝謝:) – Empeus

0

所以,當你想要的trows異常觸發您使用此:

DROP TRIGGER IF EXISTS BeforeGivingRight; 
DELIMITER $$ 
CREATE TRIGGER BeforeGivingRight 
BEFORE INSERT ON user_rights 
FOR EACH ROW 
BEGIN 
    DECLARE num_rows INT DEFAULT NULL; 
    DECLARE msg VARCHAR(32) DEFAULT ""; 
    SELECT count(valid_rights.right_code) FROM valid_rights WHERE right_code = new.right INTO num_rows; 

    IF num_rows = 0 
    THEN 
     set msg = concat('Error: That right is not allowed!', cast(new.right as char)); 
     signal sqlstate '45000' set message_text = msg; 
    END IF; 
END $$ 
DELIMITER ;