1

トリガーを更新しているときに、テーブルのレコード変更のトリガーを書き込んでいます。

CREATE TRIGGER vehicle_mst_log 
AFTER UPDATE ON vehicle_mst
FOR EACH ROW BEGIN  
    IF (OLD.COLUMN1 != NEW.COLUMN1) THEN
        INSERT INTO ABN_OLDLOGTABLE (
            TABLENAME,
            COLUMNNAME,
            OLDVALUE,
            NEWVALUEW,
            TIME,
            USER)
        VALUES (
            "TABLE",
            "COLUMN1",
            COLUMN1OLDVALUE,
            COLUMN1NEWVALUE,
            NOW(),
            USER);
    END IF;
    IF (OLD.COLUMN2 != NEW.COLUMN2) THEN
        INSERT INTO ABN_OLDLOGTABLE (
            TABLENAME,
            COLUMNNAME,
            OLDVALUE,
            NEWVALUEW,
            TIME,
            USER)
        VALUES (
            "TABLE",
            "COLUMN2",
            COLUMN2OLDVALUE,
            COLUMN2NEWVALUE,
            NOW(),
            USER);
    END IF;
END;

しかし、私はテーブルに約40の列を持っており、ループ内で列名を記述して値の変更をチェックする他の簡単な方法があります

4

1 に答える 1

4

おそらく、MySQLから特定のテーブルのスキーマを読み取り、すべての列をチェックするトリガーを作成する小さなユーティリティを作成する必要があります。テーブル構造が変更されたら、このユーティリティを再実行する必要があります。そのようなユーティリティを書くのに助けが必要な場合は私に知らせてください。

トリガーを生成するスクリプトは次のとおりです。

#!/bin/sh

db="$1";
shift

echo "DELIMITER ;;"
for table in "$@"
do
  sql="show columns from $table"
  columns=`mysql -B -N -e "$sql" "$db" | cut -f 1`
  echo "CREATE TRIGGER ${table}_log"
  echo "AFTER UPDATE ON $table"
  echo "FOR EACH ROW BEGIN"
  for column in $columns
  do
    echo "  IF (OLD.$column != NEW.$column) THEN"
    echo "    INSERT INTO ABN_OLDLOGTABLE (TABLENAME, COLUMNNAME, OLDVALUE, NEWVALUEW, TIME, USER)"
    echo "    VALUES (\"$table\", \"$column\", OLD.$column, NEW.$column, NOW(), USER());"
    echo "  END IF;"
  done
  echo "END;;"
done

名前を付けて保存しtrigger.sh、実行可能ビットを設定して(chmod a+x trigger.sh)、次のように実行します。

trigger.sh dbname table1 table2 ...

STDINにトリガーコードを出力します。

于 2013-02-25T04:50:33.353 に答える