あなたが求めているのは、監査トリガーです。実装は非常に簡単です。
まず、メイン テーブルを少し変更します。データ型のフィールドid
をinteger
主キーとしてテーブルに追加すると、テーブルは次のようになります。
tablename
( id integer PK
, first_name varchar
, address varchar
, city varchar
, country varchar
)
UNIVERSAL_AUDIT_ENTRY
ここで、スキーマ内のデータに加えられた変更を格納するテーブルなどのテーブルが必要になります。
私の経験から、この表を次のように作成することをお勧めします。
universal_audit_entry
( universal_audit_entryid integer PK
, table_name varchar -- captures the name of the table
, column_name varchar -- captures the name of the column
, entry_type varchar -- captures the event, e.g., 'INSERT' or 'UPDATE'
, primary_key_value integer -- captures, e.g., the value in tblename.id
, from_str varchar -- captures the value that was present before
, to_str varchar -- captures the value that was changed into
, timestamp datetime -- captures the timestamp of the event
, username varchar -- captures the name of user
)
テーブルの準備ができたらuniversal_audit_entry
、トリガーは次のようになります。
CREATE TRIGGER adminpanel.soft
BEFORE UPDATE ON adminpanel.aggrement
FOR EACH ROW
BEGIN
IF UPDATING(first_name) THEN
INSERT INTO universal_audit_entry VALUES
( 123 -- example for universal_audit_entryid
, 'TABLENAME'
, 'FIRST_NAME'
, 'UPDATE'
, new.id
, old.first_name
, new.first_name
, current_timestamp()
, current_user);
END IF;
END;
//
同様のロジックを使用して、同じテーブル内のさらに多くの列や他のテーブルも監査できます。
ノート:
このコードはテストされていません。ここに追加したのは、説明のためだけです。このトリガーのコードは、直接使用することは想定されていません。
new
およびold
update ステートメント中に生成される疑似レコードです。これらのレコードは、更新中の行に対応しています。:new
は、更新ステートメントが実行された後の行を:old
意味し、更新ステートメントが実行される前の行を意味します。これはOracleで機能します。MySQLでも動作するかどうかを確認してください。
編集
MySQL トリガーの詳細については、こちらを参照してください。監査証跡の詳細については、こちらとSO の質問をご覧ください。