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トリガーを使用して、それが存在するかどうかを確認することです。

編集(回答)

したがって、例外をスローするトリガーが必要な場合は、次を使用します。

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 ;
4

3 に答える 3

1

キーワード がありませんDEFAULTでした。0の代わりに使用しNULLます。

DECLARE total_sale INT DEFAULT 0;

こちらを参照してください: ストアド プロシージャ内の変数

于 2012-10-04T08:28:29.200 に答える
0

したがって、例外を発生させるトリガーが必要な場合は、これを使用します。

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 ;
于 2012-10-04T13:55:35.107 に答える
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_rightsright_codeそうでない場合は一意です。

于 2012-10-04T09:17:12.353 に答える