トリガーを起動させるステートメントを記録する、トリガーをMySQLに書きたいと思います。私はOracleでこれを行う方法を知っています:トリガーステートメントの検索
n := ora_sql_txt(sql_text);
for i in 1..n loop
stmt := stmt || sql_text(i);
end loop;
しかし、私はMySQLで同等のものを見つけることができません。
トリガーを起動させるステートメントを記録する、トリガーをMySQLに書きたいと思います。私はOracleでこれを行う方法を知っています:トリガーステートメントの検索
n := ora_sql_txt(sql_text);
for i in 1..n loop
stmt := stmt || sql_text(i);
end loop;
しかし、私はMySQLで同等のものを見つけることができません。
トリガーを発生させたステートメントの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
は通常、当社のシステム上で有効にされていない(有効になっている場合、我々は通常、わずかな時間枠のための情報を収集するために、一時的にそれを有効にします...)しかし、私は思っていません;トリガーステートメントは、完了後、つまりトリガされたトリガーが完了した後に一般ログで利用できるようになると思います。
別のオプションは、バイナリログ(バイナリログが有効な場合)です。しかし、トリガーの中からそれを得ることは、混乱を招くような厄介なように思えます。
最初のコードに構文エラーがあります。 –
それは動作しません!保存されたステートメントは、発行した更新ステートメントではなく、作成したselectステートメントです。 –
投稿したSQLに構文エラーが表示されません。明らかに、トリガー内のステートメントのシーケンスには制限があります。DECLAREステートメントは、他のステートメントの前にある必要があります。ユーザーは 'information_schema.processlist'テーブルに対してSELECT権限を持ち、セミコロンは私たちはCREATE TRIGGERステートメントの別のステートメント区切り文字を指定する必要があります。 – spencer7593