13

次のMySQLトリガーがあります

SET @iUserId = OLD.LastChangedBy; 

IF NOT NEW.LastChangedBy <=> OLD.LastChangedBy THEN
    SET @iUserId = NEW.LastChangedBy;
END IF;

IF NOT NEW.BookingId<=> OLD.BookingId THEN
    INSERT INTO AuditTrail VALUES (UUID(),@iUserId,'UPDATE','Booking', OLD.BookingId,'BookingType ',OLD.BookingType ,NEW.BookingType ,NOW());
END IF;

これは CREATE TRIGGER Booking_AUPDAFTER UPDATE ON Booking FOR EACH ROWと呼ばれます

問題は、AFTER UPDATE トリガーで OLD フィールド値を取得する方法です。

4

5 に答える 5

25

ではUPDATE TRIGGER、キーワードを使用しOLDて、更新によって置き換えられる行データにアクセスできます。このNEWキーワードにより、成功した場合に古い行を置き換える着信行データにアクセスできます。

UPDATEトリガーの例は次のとおりです。

CREATE TRIGGER upd_check AFTER UPDATE ON SomeTable
    FOR EACH ROW
    BEGIN
       IF (OLD.LastChangedBy <> NEW.LastChangedBy) THEN
         INSERT INTO AuditSomeTable(ID, LastChangedBy) 
         VALUES (OLD.ID, OLD.LastChangedBy);
       END IF;
    END;

ここでSQLFiddle

作成したトリガーのタイプによっては、OLDおよびNEW行を使用できない場合があります。

トリガーを挿入

  • NEW疑似行のみへのアクセス。

更新トリガー

  • NEWおよびOLD疑似行へのアクセス

トリガーを削除

  • OLD疑似行のみにアクセス

つまり、トリガーにはOLD行がなく、INSERTトリガーには行がありませNEWDELETE

OPの質問

OPは実際のコードと、コメントで参照されているエラーメッセージを提供していません:

INSERT トリガーに OLD 行がありません

は、OP が質問で示されたINSERT TRIGGERではなく、誤って を作成UPDATE TRIGGERしたことを示します。INSERTトリガーにはOLD疑似テーブルがありません。

于 2013-07-16T16:35:04.670 に答える
3

あなたの質問が正しければ..

答えはノーだ!AFTER UPDATE トリガーに OLD.col_name を含めることはできません。

mysql ref manual の参照用に、次のことを明確に示しています。

INSERT トリガーでは、NEW.col_name のみを使用できます。古い行はありません。DELETE トリガーでは、OLD.col_name のみを使用できます。新しい行はありません。UPDATE トリガーでは、OLD.col_name を使用して更新前の行の列を参照し、NEW.col_name を使用して更新後の行の列を参照できます。

トリガー構文

于 2014-10-16T07:15:57.660 に答える
0

これは、列の値が更新されたときにトリガーがどのように機能するかを示す完全なコードです

DELIMITER $$

CREATE TRIGGER `salestatus_after_update` AFTER UPDATE ON `salesdata`
 FOR EACH ROW BEGIN

        IF NEW.sale_status <> OLD.sale_status THEN
            SET @changetype = 'Sale Status Updated';
        ELSE
            SET @changetype = 'Sale Edited';
        END IF;

        INSERT INTO sales_notification (sale_id, changetype, notify_to, old_value, new_value) VALUES (NEW.id, @changetype, NEW.submit_by, OLD.sale_status, NEW.sale_status);

    END$$

DELIMITER ;
于 2019-07-02T13:52:32.890 に答える