トリガーでトリガーしたクエリのクエリまたはプライマリIDを取得することは可能ですか? トリガーをトリガーしたクエリの検索
は現在、我々は大体持っている:Delete from Table1 where id = 1
私は、クエリをログに記録したいかという行のid
(id
は、そのテーブルのプライマリIDで、1
は一例レコードです) (誰かが不正に悪意のあるレコードを削除しているため)削除されました。これはtrigger
とBEFORE DELETE ON
の簡単な処理のようですが、trigger
の原因となった親クエリに対処する方法がわかりません。
私が持っていることを計画:
DELIMITER $$
CREATE TRIGGER Table1_Row_Being_Deleted
BEFORE DELETE ON Table1
INSERT INTO deleted_Table1 (deleting_date, tableid) values(now(), ?);
END$$
DELIMITER;
しかし、私は?
のために配置するのか分かりません。私が見た他のスレッドやドキュメントには、静的な値があったり、テーブルのすべての行に影響を与えています。
削除しようとしているIDは 'old.id'です。 tablenameは 'Table1'です(トリガーは常に特定のテーブルに属しているため、トリガーを作成するときにtablenameがわかります)。 'FOR EACH ROW'を使うべきです。そうしないと、複数の削除を記録しません。そして、どの文がその行を削除しようとしているのか分からない。後で(例えば外部キーのために)削除が失敗した場合でもログに記録されますが、 'after delete'を使って成功した削除だけを記録することができます。 – Solarflare
'どの行が行を削除しようとしているのかわからない。それはまさに私が知る必要があるものだ。これをトレースできるシステムレベルのイベントはありませんか?'after delete'を使うと、レコードは既に消えていないのですか、それとも一時的にメモリに保存されていて、まだアクセス可能ですか? 1つのクエリで2つの削除されたレコードが存在することはありませんので、1つのクエリで複数の削除を心配する必要はありません。 – chris85
'old'は削除後も値を含む特別な行です。あなたのクエリをトレースするには、 'performance_schema.events_statements'や' performance_schema.events_statements_history'(最後のオプションを設定する必要があります)をチェックアウトしたい場合があります。それらはあなたのトリガーイベントに直接リンクされていませんが、何らかの方法でリンクすることができます(タイムスタンプやテーブル名が文字列内にあるかどうかをチェックするなどして行を間接的に削除することも可能です)。クエリーテキストに含まれないか、いくつかのクエリーを保存して後でチェックしてください) – Solarflare