2017-12-05 3 views
2

トリガーを起動させるステートメントを記録する、トリガーをMySQLに書きたいと思います。私はOracleでこれを行う方法を知っています:トリガーステートメントの検索

n := ora_sql_txt(sql_text); 
for i in 1..n loop 
    stmt := stmt || sql_text(i); 
end loop; 

しかし、私はMySQLで同等のものを見つけることができません。

答えて

0

トリガーを発生させたステートメントのSQLテキストは、information_schemaデータベースのprocesslistテーブルで使用できる場合があります。

多分このような何か(テストしていません)

DECLARE ls_pl_info VARCHAR(65536); 

SELECT pl.info 
    INTO ls_pl_info 
    FROM information_schema.processlist pl 
WHERE pl.id = CONNECTION_ID() ; 

-or maybe-

SELECT t.processlist_info 
    INTO ls_pl_info 
    FROM performance_schema.threads t 
WHERE t.processlist_id = CONNECTION_ID() ; 

(私はわからないんだけど、およびテストしていませんどのような、情報の列はSQLが含まれているかどうかでありますトリガーを起動したステートメントのテキスト、または現在のステートメントのテキストが表示され、プロセスリストテーブルにアクセスしている場合)。

しかし、それは私が来ることができる最も近いものです。私はトリガを引き起こした文のテキストがトリガ内で利用可能であるとは思わない。

参考文献:

https://dev.mysql.com/doc/refman/5.7/en/processlist-table.html

https://dev.mysql.com/doc/refman/5.7/en/thread-information.html

注:general_logは通常、当社のシステム上で有効にされていない(有効になっている場合、我々は通常、わずかな時間枠のための情報を収集するために、一時的にそれを有効にします...)しかし、私は思っていません;トリガーステートメントは、完了後、つまりトリガされたトリガーが完了した後に一般ログで利用できるようになると思います。

別のオプションは、バイナリログ(バイナリログが有効な場合)です。しかし、トリガーの中からそれを得ることは、混乱を招くような厄介なように思えます。

+0

最初のコードに構文エラーがあります。 –

+0

それは動作しません!保存されたステートメントは、発行した更新ステートメントではなく、作成したselectステートメントです。 –

+0

投稿したSQLに構文エラーが表示されません。明らかに、トリガー内のステートメントのシーケンスには制限があります。DECLAREステートメントは、他のステートメントの前にある必要があります。ユーザーは 'information_schema.processlist'テーブルに対してSELECT権限を持ち、セミコロンは私たちはCREATE TRIGGERステートメントの別のステートメント区切り文字を指定する必要があります。 – spencer7593