0

下にこのトリガーがあり、emplog テーブルに新しい値を挿入します。たとえば、last_name を変更した場合に発生したイベントを説明列に挿入するトリガーを作成したいのですが、old.lastname が変更されました。 new.last_name、更新された名、性別、生年月日、婚姻またはssnの場合、同じことを行う必要があります。初心者の私は、これをどのように達成できますか?

CREATE TRIGGER emplog_update AFTER UPDATE ON emp 
FOR EACH ROW 
INSERT INTO emplog VALUES 
(NEW.id,NEW.lastname,NEW.firstname,NEW.gender,NEW.dob,NEW.marital,NEW.SSN,'U',NULL,USER(),('this is where the description will go')); 
4

1 に答える 1

0

selectの代わりに使用valuesして、列のリストを生成できます。

concat_ws()case ステートメントを使用して値を比較することにより、文字列を連結するために使用できます。次のバージョンでは、列に NULL 値がないことを前提としています。

CREATE TRIGGER emplog_update AFTER UPDATE ON emp 
FOR EACH ROW 
INSERT INTO emplog  (id, lastnmae, firstname, . . .)
    select NEW.id,NEW.lastname,NEW.firstname,NEW.gender,NEW.dob,NEW.marital,NEW.SSN,'U',NULL,USER(),
           concat_ws(',',
                     (case when new.id <> old.id then 'id' end),
                     (case when new.lastname <> old.lastname then 'lastname' end),
                     (case when new.firstname <> old.firstname then 'firstname' end),
                     . . .
                    );

注意として、insertステートメントにテーブルの列をリストする必要があります。これは、コードを維持しやすくするための良い方法であり、トリガーにとっては特に重要です。誰かが列を削除したり名前を変更したりすると、次の更新でトリガーが失敗し、不可解な電子メール メッセージが表示される可能性があります。

...すべての列を同様のコードに置き換えます。

于 2013-04-24T17:55:10.547 に答える