0

更新の前後にテーブル内の任意の列を更新するときに発生するイベントをキャプチャするトリガーを作成しようとしています。4 つの列があるとします。

first_name  address  city  country

私が編集したとしましょ first_nameJack to Henk。別のテーブルにコマンドを挿入する必要があります(i.e. update) ,time , descriptionが、説明内に記述したい ジャックは現在のユーザーによってジョンに変更さ(i.e using the current-user () function)れました。Mechinkova から Tostov に更新されている都市の場合は、他の列でも同じことを行う必要があります。

トリガー内に concat 関数を追加する必要があることはわかっています。たとえば、次のようにしたいと考えています。

DROP TRIGGER IF EXISTS adminpanel.soft//
CREATE TRIGGER adminpanel.soft BEFORE UPDATE ON adminpanel.aggrement
FOR EACH ROW
BEGIN
INSERT INTO adminpanel.aggretrigger(cmd, time, cmd_user, last_name, city) VALUES("INSERT", NOW(), CURRENT_USER(), new.last_name, new.city);
END
//
4

1 に答える 1

0

あなたが求めているのは、監査トリガーです。実装は非常に簡単です。

まず、メイン テーブルを少し変更します。データ型のフィールドidinteger主キーとしてテーブルに追加すると、テーブルは次のようになります。

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

同様のロジックを使用して、同じテーブル内のさらに多くの列や他のテーブルも監査できます。

ノート:

  1. このコードはテストされていません。ここに追加したのは、説明のためだけです。このトリガーのコードは、直接使用することは想定されていません。

  2. newおよびoldupdate ステートメント中に生成される疑似レコードです。これらのレコードは、更新中の行に対応しています。:newは、更新ステートメントが実行された後の行を:old意味し、更新ステートメントが実行される前の行を意味します。これはOracleで機能します。MySQLでも動作するかどうかを確認してください。


編集

MySQL トリガーの詳細については、こちらを参照してください。監査証跡の詳細については、こちらSO の質問をご覧ください。

于 2013-04-19T20:01:01.250 に答える