0

私のアイデアは、次の列を持つ「changelog_table」というテーブルを作成することでした。

updated_table     //the table being updated
updated_column    //the column being updated
updated_row       //the id of the row being updated
updated_content   //this is what they updated the field to
updated_user      //the user who updated
updated_datetime  //the timestamp it was updated

これは私が本当に欲しいものの最小値と最大値の両方だと思いますが、間違っているかもしれません。また...何週間も読んだ後、トリガーに変数(「どのテーブルが更新されているか」や「どの列が更新されているか」など)を保存する方法がわかりません。

たとえば、「foo_table」という名前のテーブルがあり、列「bar_column」、行「58008」があり、ユーザー「peter_griffin」によって 12/30/ に「これは新しいコンテンツです」に更新されているとします。 2013年の正午。

それをキャプチャできるトリガーはどのようなものでしょうか?

4

1 に答える 1

2

各テーブルに個別のトリガーを作成する必要がありますUPDATE(必要に応じて、INSERTandDELETEも)。実際のログ記録を行う同じストアド プロシージャをそれぞれ呼び出すことができます。

トリガーは、操作が実行されているテーブルの名前を含むパラメーターをストアド プロシージャに渡すことができます (トリガーはテーブル固有であるため、トリガーはこれを認識します。ハードコーディングする必要があります)。NEW.columnどの列が更新されたかを検出するには、各トリガー内でOLD.column、それぞれのテーブルの各列と比較する必要があります。

例えば:

CREATE TRIGGER upd_tbl_name AFTER UPDATE ON tbl_name FOR EACH ROW
  CALL AuditLog('UPDATE', 'tbl_name', NEW.id, CONCAT_WS(',',
    IF(NEW.columnA <=> OLD.columnA, NULL, CONCAT('columnA:=', NEW.columnA)),
    IF(NEW.columnB <=> OLD.columnB, NULL, CONCAT('columnB:=', NEW.columnB)),
    -- etc.
  ));

CREATE PROCEDURE AuditLog(
  Action VARCHAR(10),
  TableName VARCHAR(64),
  RowID INT,
  Columns TEXT,
)
  INSERT INTO changelog_table VALUES (
    Action,
    TableName,
    RowID,
    Columns
    USER(),
    NOW(),
  );
于 2012-05-03T16:39:38.000 に答える