Frage

Ich denke darüber nach, Trigger als Protokollierungsmechanismus in MySQL (v. 5.1) zu verwenden, und daher möchte ich, dass mein Auslöser die Abfragebarstellung erhalten, um sie in einem anderen TABE zu speichern.

Ich konnte so etwas in der MySQL -Dokumentation nicht finden, also erwarte ich, dass die Antwort nein ist - aber ich hoffe immer noch, dass ich etwas übersehen habe.

PS: Diese Frage bezieht sich auf Icarusnms Antwort auf meine Frage "Log MySQL DB ändern Abfragen und Benutzer".

War es hilfreich?

Lösung

Ich habe eine Arbeitstheorie (Laforge würde Capt Picard sagen)...

Da Sie MySQL 5.1 verwenden, haben Sie Zugriff auf die Tabelle Information_schema.processlist.

Sie haben auch Zugriff auf die ID des aktuellen Prozesses, auf dem der Trigger ausgeführt wird. Die Funktion, diese Prozess -ID zu erhalten, ist Connection_id.

Sie könnten versuchen, die Abfrage wie folgt herauszufinden:

SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();

Denken Sie daran, dass die info ist longtext:

mysql> show create table information_schema.processlist\G
*************************** 1. row ***************************
       Table: PROCESSLIST
Create Table: CREATE TEMPORARY TABLE `PROCESSLIST` (
  `ID` bigint(4) NOT NULL DEFAULT '0',
  `USER` varchar(16) NOT NULL DEFAULT '',
  `HOST` varchar(64) NOT NULL DEFAULT '',
  `DB` varchar(64) DEFAULT NULL,
  `COMMAND` varchar(16) NOT NULL DEFAULT '',
  `TIME` int(7) NOT NULL DEFAULT '0',
  `STATE` varchar(64) DEFAULT NULL,
  `INFO` longtext
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

Innerhalb des Auslösers können Sie eine lokale Variable verwenden, um die Abfrage zu halten

DECLARE original_query VARCHAR(1024);

und erfassen Sie dann die Abfrage

SELECT info INTO original_query FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = CONNECTION_ID();

Versuche es !!!

Wenn es funktioniert, dann

Machen Sie es so (Capt Picard würde zu Lafforge zurückzählen)

Andere Tipps

DROP TRIGGER IF EXISTS DEBUG_TIGGER;
CREATE TRIGGER DEBUG_TIGGER
AFTER UPDATE ON my_table 
FOR EACH ROW 
BEGIN
    INSERT INTO log_my_table(query)
    SELECT argument 
    FROM mysql.general_log 
    WHERE thread_id = connection_id()
    ORDER BY event_time DESC 
    LIMIT 5; /*gives last 5 queries(this will help you get idea of what logical path was taken)*/

    INSERT log_my_table
    (query)
    VALUES('-----------------');/*empty place holder*/
END
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top