2

私は過去4時間、解決策を探してWebを検索しましたが、見つけることができるのは次のとおりです。

できません。不可能。起こらないだろう。

私はそのアプローチが好きではありません。

私の理論では、それがinformation_schema.processlistのある時点で保存された場合、それを取得するための何らかの方法が必要です。プロセスリストテーブルでトリガーを実行しようとしましたが、それを機能させることができませんでした。ビューであるためだと思います。ログを実行することはオプションではありません。これは、すでに混雑しているサーバーのパフォーマンスに影響を与えるだけでなく、実行中のクエリが多数あり、特定のテーブルにログオンしてから更新時にのみログオンするようにしたいためです。

これは伝説的なスタックオーバーフローです!天才が溢れているので、すべての問題の解決策を見つけることができる場所!!!

だから、天才はどこにいるのか、お願いします!見せて!:-)

ありがとう、ゼッド

4

3 に答える 3

2

ここでの問題は、MySQL トリガーの範囲がステートメント レベルではなく行レベルであることです。そのため、トリガー内では、特定の行の各列の OLD 値と NEW 値にアクセスできますが、トリガーを起動させたステートメントにはアクセスできません。

information_schema.processlist に関しては、そのビューに実際に「保存」(永続化) されるものはありません。これは processlist への単なる SQL インターフェイスであり、トリガーを起動させたステートメントにはトリガーのスコープ内ではアクセスできません。

一般的なクエリ ログを有効にしたくないとおっしゃいましたが、このアプローチは複数の理由で完全ではありません (event_Time の粒度が 1 秒であることなど)。 general_log テーブル:

SET GLOBAL GENERAL_LOG='ON';
SET GLOBAL LOG_OUTPUT='TABLE';

DELIMITER || 

CREATE TRIGGER DEBUG_DATE BEFORE UPDATE ON db.tbl FOR EACH ROW 
BEGIN 
  DECLARE Q MEDIUMTEXT; 
  SELECT argument INTO Q 
  FROM mysql.general_log 
  where thread_id = connection_id() 
  order by event_time desc 
  limit 1;

  INSERT INTO db.tbl_log (INFO) 
  VALUES (Q); 

END ||

DELIMITER ;
于 2012-05-18T14:05:18.297 に答える
0
SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ... ;
于 2012-05-18T11:17:20.737 に答える