2016-05-26 10 views
-1

トリガーでトリガーしたクエリのクエリまたはプライマリIDを取得することは可能ですか? トリガーをトリガーしたクエリの検索

は現在、我々は大体持っている:

Delete from Table1 where id = 1 

私は、クエリをログに記録したいかという行のididは、そのテーブルのプライマリIDで、1は一例レコードです) (誰かが不正に悪意のあるレコードを削除しているため)削除されました。これはtriggerBEFORE 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; 

しかし、私は?のために配置するのか分かりません。私が見た他のスレッドやドキュメントには、静的な値があったり、テーブルのすべての行に影響を与えています。

+0

削除しようとしているIDは 'old.id'です。 tablenameは 'Table1'です(トリガーは常に特定のテーブルに属しているため、トリガーを作成するときにtablenameがわかります)。 'FOR EACH ROW'を使うべきです。そうしないと、複数の削除を記録しません。そして、どの文がその行を削除しようとしているのか分からない。後で(例えば外部キーのために)削除が失敗した場合でもログに記録されますが、 'after delete'を使って成功した削除だけを記録することができます。 – Solarflare

+0

'どの行が行を削除しようとしているのかわからない。それはまさに私が知る必要があるものだ。これをトレースできるシステムレベルのイベントはありませんか?'after delete'を使うと、レコードは既に消えていないのですか、それとも一時的にメモリに保存されていて、まだアクセス可能ですか? 1つのクエリで2つの削除されたレコードが存在することはありませんので、1つのクエリで複数の削除を心配する必要はありません。 – chris85

+1

'old'は削除後も値を含む特別な行です。あなたのクエリをトレースするには、 'performance_schema.events_statements'や' performance_schema.events_statements_history'(最後のオプションを設定する必要があります)をチェックアウトしたい場合があります。それらはあなたのトリガーイベントに直接リンクされていませんが、何らかの方法でリンクすることができます(タイムスタンプやテーブル名が文字列内にあるかどうかをチェックするなどして行を間接的に削除することも可能です)。クエリーテキストに含まれないか、いくつかのクエリーを保存して後でチェックしてください) – Solarflare

答えて

1

トリガーとトリガーをトリガーしたクエリとの間に直接のリンクはありません。しかし、performance schemaを使用すると、すべてのアクティブなクエリを検索してログに記録することができます。そのうちの1つが発信者の問い合わせである必要があります。

create trigger Table1_Row_Being_Deleted after delete on Table1 
for each row 
    insert into deleted_Table1(id, dt, user, qry) 
    select old.id, now(), user(), performance_schema.events_statements_current.sql_text 
    from performance_schema.events_statements_current; 

正しいクエリが知られていないので、これは、すべてのアクティブなクエリをログに記録し、これにより、ノイズの多いだろう。それは間接的なクエリ(例えば手続きからのもの)である可能性があるので、正しいクエリは、その中に 'table1からの削除'のような特徴的な部分を常に有するとは限らない。したがって、問題が発生するたびにログテーブルに表示される一般的なクエリを探します。

私はここafter deleteトリガを使用するので、それだけでdeleteが成功したとき、あなたはdeleteが後で(例えば外部キー制約のため)失敗した場合でもログインすることbefore deleteトリガーを使用する場合があります記録されます。

old.id(および行全体old)には、行が削除される前の値が含まれています(エントリをログに記録するためにここでも使用できます)。

通常、performance schemaevents_statements_current -logはデフォルトで有効になっています。 (つまり、その時点でアクティブクエリだったので)これは、少なくともこのselect -query自体と行を含むべき

select * from performance_schema.events_statements_current; 

からの結果を確認。それが空の場合(またはそれを使用する権限がないか、存在しない場合)、show variables like 'performance_schema';ONが表示されるかどうかを確認する必要があります。また、アクセス許可やログオプションを設定する必要があるかもしれません。Query Profiling Using Performance Schemaを参照してください。

関連する問題