sql >> データベース >  >> RDS >> Mysql

MySQLトリガーは、トリガーを起動する原因となった現在のクエリを取得します

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

    information_schema.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 ;
    


    1. MySQLとPHPを使用したベストマッチ

    2. LOAD DATALOCALINFILEは69k行でインポートを停止します

    3. 最大値でグループ化しながら個別の行を選択する

    4. MacOSでMysqlシェルをアンインストールする方法