Ist es mit einem Auslöser möglich, die Abfrage oder primäre ID der Abfrage zu erhalten, die sie ausgelöst hat?Suche nach einer Abfrage, die einen Auslöser ausgelöst hat
Derzeit etwa haben wir:
Delete from Table1 where id = 1
(id
die primäre ID der Tabelle ist, 1
ist nur ein Beispiel Datensatz)
Ich möchte ist, um die Abfrage oder die id
der Zeile anmelden gelöscht (weil jemand Datensätze falsch löscht (nicht bösartig)). Dies schien, als wäre es ein einfacher Prozess mit einem trigger
und BEFORE DELETE ON
, aber ich kann nicht herausfinden, wie die übergeordnete Abfrage, die die trigger
auslösen ausgelöst hat.
ich geplant haben:
DELIMITER $$
CREATE TRIGGER Table1_Row_Being_Deleted
BEFORE DELETE ON Table1
INSERT INTO deleted_Table1 (deleting_date, tableid) values(now(), ?);
END$$
DELIMITER;
Aber ich weiß nicht, was für die ?
zu setzen. Alle anderen Threads und Dokumente, die ich gesehen habe, hatten statische Werte oder betrafen jede Zeile in der Tabelle.
Die ID, die gelöscht wird, ist 'old.id'. Der Tabellenname ist 'Table1' (ein Trigger gehört immer zu einer bestimmten Tabelle, daher kennen Sie den Tabellennamen, wenn Sie den Trigger erstellen). Sie sollten 'FÜR JEDE ZEILE 'verwenden, sonst protokollieren Sie nicht mehrere Löschungen. Und Sie können nicht wissen, welche Anweisung versucht, die Zeile zu löschen. Und Sie werden auch dann protokollieren, wenn das Löschen später fehlschlägt (z. B. wegen eines Fremdschlüssels). Sie können 'nach dem Löschen 'verwenden, um nur erfolgreiche Löschungen zu protokollieren. – Solarflare
'Sie können nicht wissen, welche Anweisung versucht, die Zeile zu löschen 'Das ist genau das, was ich wissen muss. Es gibt kein Ereignis auf Systemebene, von dem aus es zurückverfolgt werden kann?Wenn ich 'after delete' benutze ist die Aufnahme nicht schon weg oder ist sie temporär im Speicher gespeichert und trotzdem erreichbar? Es werden nie zwei gelöschte Datensätze in einer Abfrage vorhanden sein, so dass ich mir keine Gedanken über mehrere Löschungen in einer Abfrage machen muss. – chris85
'alt' ist eine spezielle Zeile, die den Wert auch nach dem Löschen enthält. Um Ihre Anfrage zu verfolgen, sollten Sie 'performance_schema.events_statements' und/oder' performance_schema.events_statements_history' auschecken (Sie müssen eine Option für den letzten festlegen), sie enthalten aktive und vergangene Querys. Sie sind nicht direkt mit Ihrem Triggerereignis verknüpft, aber Sie können sie irgendwie verlinken (zB durch einen Zeitstempel oder durch Überprüfung, ob der Tabellenname in der Zeichenkette ist, obwohl es natürlich möglich ist, eine Zeile indirekt zu löschen, so der Tabellenname) nicht im Querytext sein, oder mehrere Queries speichern und später prüfen) – Solarflare