Über TriggerIn der realen Entwicklung begegnen wir dieser Situation häufig. Wenn wir beispielsweise Informationen hinzufügen, löschen oder ändern, müssen wir Protokolle aufzeichnen. Wir müssen nach Abschluss der regulären Datenbanklogikoperationen in die Protokolltabelle schreiben, was zu einer zweistufigen Operation wird und komplizierter ist. Wenn Sie beispielsweise die Informationen einer Person löschen, müssen Sie auch deren Einkaufsaufzeichnungen, Lieferadresse, Favoriten usw. löschen. Dieser fortlaufende Vorgang ist fehleranfällig und Konsistenz und Integrität können nicht garantiert werden. Zu diesem Zeitpunkt sollten Trigger verwendet werden, wodurch nicht nur viel Geschäftslogikcode vermieden, sondern auch die Datenintegrität besser gewährleistet werden kann. Ein Trigger ist ein Datenbankobjekt, das sich auf eine Tabelle bezieht: Es löst eine Aktion aus, wenn die definierten Bedingungen erfüllt sind, und führt die im Trigger definierte Anweisungsgruppe aus. Diese Triggerfunktion kann Anwendungen dabei helfen, die Datenintegrität auf der Datenbankseite sicherzustellen. Es handelt sich um eine spezielle gespeicherte Prozedur, die mit einem Tabellenereignis verknüpft ist und aktiviert und ausgeführt wird, wenn ein Vorgang (Einfügen, Löschen, Aktualisieren) für eine Tabelle ausgeführt wird. Verwendung von Triggern Erstellen eines TriggersDie Syntax zum Erstellen eines Triggers lautet wie folgt: TRIGGER ERSTELLEN trigger_name trigger_time trigger_event ON t_name FÜR JEDE ZEILE trigger_stmt veranschaulichen: trigger_name: Name des Auslösers tirgger_time: Zeitpunkt der Trigger-Ausführung, vor der Datenoperation (BEFORE) oder nach der Datenoperation (AFTER) trigger_event: Ereignis auslösen, hinzufügen (INSERT), löschen (DELETE), ändern (UPDATE) t_name: bezieht sich auf das Erstellen eines Triggers in der Tabelle t_name trigger_stmt: Der Hauptteil des Triggers, der eine SQL-Anweisung oder mehrere Anweisungen sein kann, die von BEGIN und END umschlossen sind. Trigger können nur auf permanenten Tabellen (Permanent) erstellt werden, nicht auf temporären Tabellen (Temporary) FOR EACH ROW fester Ausdruck, der angibt, dass jede Operation an einem Datensatz, der das Triggerereignis erfüllt, den Trigger auslöst Es gibt zwei Arten von Trigger_Time und drei Arten von Trigger_Event, also insgesamt 6 Kombinationen: BEFORE INSERT, BEFORE DELETE, BEFORE UPDATE, AFTER INSERT, AFTER DELETE, AFTER UPDATE Beispiel (erstellen Sie zuerst eine Protokolltabelle, um den Wert einzutragen, wenn der Trigger ausgelöst wird): /*Erstellen Sie zuerst eine Protokolltabelle, um den Wert einzutragen, wenn der Trigger ausgelöst wird*/ mysql> TABELLE DROP, WENN `TriggerLog` EXISTIERT; Abfrage OK, 0 Zeilen betroffen mysql> Tabelle „TriggerLog“ erstellen ( `id` INT auto_increment PRIMÄRSCHLÜSSEL, `trigger_time` VARCHAR(30), `trigger_event` VARCHAR(30), `memo` VARCHAR(200) ); Abfrage OK, 0 Zeilen betroffen Triggertyp einfügen: MySQL> /*Hier wird das Ende des SQL-Skripts als // */ deklariert. TRENNUNGSZEICHEN // TRIGGER LÖSCHEN, WENN EXISTIERT trig_after_insert; Erstellen Sie einen Trigger „trig_after_insert“ nach dem Einfügen für Studenten für jede Zeile. BEGINNEN in `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) Werte einfügen ('nach','einfügen',concat('neue Studenteninfo,id:',cast(new.studentid as char))); ENDE // Abfrage OK, 0 Zeilen betroffen MySQL> /*Setzt das Ende des SQL-Skripts zurück auf; */ TRENNUNGSZEICHEN ; Abfrage OK, 0 Zeilen betroffen MySQL> /*Fügen Sie ein Datenelement ein*/ in Studenten einfügen (Studentenname, Punktzahl, Klassen-ID) Werte ('Trigger1', 100,0); Abfrage OK, 1 Zeile betroffen MySQL> /*Fragen Sie die Protokolltabelle ab, um zu sehen, ob ein Trigger-Schreibvorgang vorliegt*/ Wählen Sie * aus „TriggerLog“; +----+--------------+------------------+------------------------+ | ID | Auslösezeit | Auslöseereignis | Memo | +----+--------------+------------------+------------------------+ | 1 | nach | einfügen | Informationen zum neuen Studenten, ID:21 | +----+--------------+------------------+------------------------+ 1 Reihe im Set Auslöser vom Aktualisierungstyp: MySQL> /*Hier wird das Ende des SQL-Skripts als // */ deklariert. TRENNUNGSZEICHEN // TRIGGER LÖSCHEN, WENN EXISTIERT, trig_after_update; Erstellen Sie den Trigger „trig_after_update“ nach dem Update für Studenten für jede Zeile. BEGINNEN in `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) Werte einfügen ('nach', 'aktualisieren', concat('Studenteninfo aktualisieren, ID:', cast(new.studentid as char))); ENDE // Abfrage OK, 0 Zeilen betroffen MySQL> /*Setzt das Ende des SQL-Skripts zurück auf; */ TRENNUNGSZEICHEN ; Abfrage OK, 0 Zeilen betroffen MySQL> /*Daten aktualisieren*/ Aktualisiere die Schüler, setze Punktzahl=99, wobei Schülername='Trigger1'; Abfrage OK, 1 Zeile betroffen Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0 MySQL> /*Frage die Protokolltabelle ab, um zu sehen, ob beim Aktualisieren ein Schreibtrigger vorliegt*/ Wählen Sie * aus „TriggerLog“; +----+--------------+------------------+---------------------------+ | ID | Auslösezeit | Auslöseereignis | Memo | +----+--------------+------------------+---------------------------+ | 1 | nach | einfügen | Informationen zum neuen Studenten, ID:21 | | 2 | nach | aktualisieren | Studenteninfo aktualisieren, ID:21 | +----+--------------+------------------+---------------------------+ 2 Reihen im Set Auslöser vom Typ „Löschen“: MySQL> /*Hier wird das Ende des SQL-Skripts als // */ deklariert. TRENNUNGSZEICHEN // TRIGGER LÖSCHEN, WENN EXISTIERT, trig_after_delete; Erstellen Sie den Trigger „trig_after_delete“ nach dem Löschen für Studenten für jede Zeile. BEGINNEN in `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) Werte einfügen ('nach','aktualisieren',concat('Studenteninfo löschen,id:',cast(old.studentid as char))); ENDE // Abfrage OK, 0 Zeilen betroffen MySQL> /*Setzt das Ende des SQL-Skripts zurück auf; */ TRENNUNGSZEICHEN ; Abfrage OK, 0 Zeilen betroffen MySQL> /* Daten löschen */ Löschen aus Studenten, bei denen Student-ID=21 ist; Abfrage OK, 1 Zeile betroffen MySQL> /*Fragen Sie das Protokoll ab, um zu sehen, ob das Löschen einen Schreibvorgang auslöst*/ Wählen Sie * aus „TriggerLog“; +----+--------------+------------------+---------------------------+ | ID | Auslösezeit | Auslöseereignis | Memo | +----+--------------+------------------+---------------------------+ | 1 | nach | einfügen | Informationen zum neuen Studenten, ID:21 | | 2 | nach | aktualisieren | Studenteninfo aktualisieren, ID:21 | | 3 | nach | aktualisieren | löschen Studenteninfo,ID:21 | +----+--------------+------------------+---------------------------+ 3 Reihen im Set Trigger anzeigenAlle Trigger anzeigen Auslöser anzeigen; --Syntax mysql> Trigger anzeigen; +-------------------+--------+----------+-------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+---------------------+ | Auslöser | Ereignis | Tabelle | Anweisung | Zeitpunkt | Erstellt | SQL-Modus | Definierer | Zeichensatzclient | Sortierverbindung | Datenbanksortierung | +-------------------+--------+----------+-------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+---------------------+ | trig_after_insert | EINFÜGEN | Studenten | BEGINNEN in `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) Werte einfügen ('nach','einfügen',concat('neue Studenteninfo,id:',cast(new.studentid as char))); ENDE | NACH | NULL | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@localhost | utf8 | utf8_general_ci | latin1_swedish_ci | | trig_after_update | UPDATE | Studenten | BEGINNEN in `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) Werte einfügen ('nach', 'aktualisieren', concat('Studenteninfo aktualisieren, ID:', cast(new.studentid as char))); ENDE | NACH | NULL | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@localhost | utf8 | utf8_general_ci | latin1_swedish_ci | | trig_after_delete | LÖSCHEN | Studenten | BEGINNEN in `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) Werte einfügen ('nach','aktualisieren',concat('Studenteninfo löschen,id:',cast(old.studentid as char))); ENDE | NACH | NULL | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@localhost | utf8 | utf8_general_ci | latin1_swedish_ci | +-------------------+--------+----------+-------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+---------------------+ 3 Reihen im Set Zeigen Sie die Erstellungsanweisung des Triggers an Trigger „Triggername“ erstellen anzeigen; --Syntax mysql> Trigger „trig_after_insert“ anzeigen; +-------------------+--------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | Trigger | SQL-Modus | Ursprüngliche SQL-Anweisung | Zeichensatzclient | Sortierverbindung | Datenbanksortierung | +-------------------+--------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | trig_after_insert | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` TRIGGER trig_after_insert NACH INSERT ON students FÜR JEDE ZEILE BEGINNEN in `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) Werte einfügen ('nach','einfügen',concat('neue Studenteninfo,id:',cast(new.studentid as char))); ENDE | utf8 | utf8_general_ci | latin1_swedish_ci | +-------------------+--------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ 1 Reihe im Set Löschen eines TriggersAuslöser löschen Auslösername; --Syntax mysql> Trigger „trig_after_insert“ löschen; Abfrage OK, 0 Zeilen betroffen mysql> Trigger „trig_after_insert“ anzeigen; 1360 - Auslöser existiert nicht Verwendungshinweise Der Unterschied zwischen NEU und ALTDer Trigger zielt auf jede Datensatzzeile in der Datenbank. Jede Datenzeile hat vor und nach der Operation einen entsprechenden Status. Der Trigger speichert den Status vor der Operation unter dem alten Schlüsselwort und den Status nach der Operation unter dem neuen Schlüsselwort. new.cname – eine Datenspalte in der neu hinzugefügten Zeile (oder der Zeile vor der Änderung) old.cname – eine Datenspalte in der gelöschten Zeile (oder der Zeile nach der Änderung) Dabei ist zu beachten, dass nicht alle Trigger alt und neu sind.
Tatsächlich haben wir bereits new/old verwendet, um Trigger zu erstellen und Daten abzurufen. Lassen Sie uns den Update-Trigger (trig_after_update) basierend auf dieser Tabelle ändern und die Ausgabe vor und nach der Änderung vergleichen: MySQL> /*Hier wird das Ende des SQL-Skripts als // */ deklariert. TRENNUNGSZEICHEN // TRIGGER LÖSCHEN, WENN EXISTIERT, trig_after_update; Erstellen Sie den Trigger „trig_after_update“ nach dem Update für Studenten für jede Zeile. BEGINNEN in `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) Werte einfügen ('nach','aktualisieren',concat('von:',alter.Studentenname',',',alter.Score' ','bis:',neuer.Studentenname',',',neuer.Score)); ENDE // Abfrage OK, 0 Zeilen betroffen MySQL> /*Setzt das Ende des SQL-Skripts zurück auf; */ TRENNUNGSZEICHEN ; Abfrage OK, 0 Zeilen betroffen MySQL> /*Noten und Namen aktualisieren*/ Aktualisiere die Studenten, setze Punktzahl=106,Studentenname='Trigger2', wobei Studenten-ID=17 ist; Abfrage OK, 1 Zeile betroffen Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0 MySQL> /*Vergleiche die Werte vor und nach dem Update basierend auf Alt und Neu*/ Wählen Sie * aus „TriggerLog“; +----+--------------+------------------+---------------------------------------+ | ID | Auslösezeit | Auslöseereignis | Memo | +----+--------------+------------------+---------------------------------------+ | 1 | nach | einfügen | Informationen zum neuen Studenten, ID:21 | | 2 | nach | aktualisieren | Studenteninfo aktualisieren, ID:21 | | 3 | nach | aktualisieren | löschen Studenteninfo,ID:21 | | 4 | nach | Update | von:Test2,101.00 bis:Trigger2,106.00 | +----+--------------+------------------+---------------------------------------+ 4 Reihen im Set Änderungen an derselben Tabelle können nicht ausgelöst werdenDer MySQL-Trigger kann für diese Tabelle keine Einfüge-, Aktualisierungs- oder Löschvorgänge durchführen, andernfalls wird ein Fehler gemeldet. MySQL> /*Hier wird das Ende des SQL-Skripts als // */ deklariert. TRENNUNGSZEICHEN // TRIGGER LÖSCHEN, WENN EXISTIERT trig_after_insert; Erstellen Sie einen Trigger „trig_after_insert“ nach dem Einfügen für Studenten für jede Zeile. BEGINNEN Aktualisiere die Punktzahl der Studenten, setze sie = Punktzahl+1, wobei Studenten-ID = neue Studenten-ID; ENDE // Abfrage OK, 0 Zeilen betroffen MySQL> /*Setzt das Ende des SQL-Skripts zurück auf; */ TRENNUNGSZEICHEN ; Abfrage OK, 0 Zeilen betroffen MySQL> /*Nach dem Einfügen eines Datenelements wird ein Fehler gemeldet, da die Änderung dieser Tabelle ausgelöst wird*/ in Studenten einfügen (Studentenname, Punktzahl, Klassen-ID) Werte ('Trigger2', 101,0); 1442 – Tabelle „Studenten“ kann in der gespeicherten Funktion/dem gespeicherten Trigger nicht aktualisiert werden, da sie bereits von der Anweisung verwendet wird, die diese gespeicherte Funktion/diesen gespeicherten Trigger aufgerufen hat. Zusammenfassung 1. Trigger können kaskadierende Änderungen über zugehörige Tabellen in der Datenbank implementieren, d. h. Änderungen an den Daten in einer Tabelle wirken sich auf die Daten in anderen Tabellen aus, z. B. Datenänderungen, Datenstatistiken, Datenreplikation usw. Zwei Einschränkungen von Triggern 1. Trigger können weder gespeicherte Prozeduren aufrufen, die Daten an den Client zurückgeben, noch dynamische SQL-Anweisungen verwenden, die die CALL-Anweisung verwenden. Gespeicherte Prozeduren dürfen jedoch Daten über Parameter an Trigger zurückgeben. Das heißt, gespeicherte Prozeduren oder Funktionen können Daten über Parameter vom Typ OUT oder INOUT an Trigger zurückgeben, aber Prozeduren, die Daten direkt zurückgeben, können nicht aufgerufen werden. Oben finden Sie detaillierte Informationen zur Verwendung von MySQL-Triggern und den Dingen, die beachtet werden müssen. Weitere Informationen zu MySQL-Triggern finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
>>: js zum Implementieren von Details im Datei-Upload-Stil
Bei diesem Thema handelt es sich um einen interne...
In diesem Artikelbeispiel wird der spezifische Co...
WML (Wireless Markup Language). Es handelt sich u...
Inhaltsverzeichnis Knoten-Ereignisschleife Ereign...
Was ist HTML? HTML ist eine Sprache zur Beschreib...
Ohne weitere Umschweife werde ich den Code direkt...
Die Konfigurationsdatei nginx.conf lautet wie fol...
1. Komplettlösung 1. Problemanalyse und -lokalisi...
Vorwort Hinweis: Die Testdatenbankversion ist MyS...
Wenn der Umfang der Docker-Bereitstellung zunimmt...
Sie können Docker-Container auf verschiedene Arte...
Kapitel 1 <br />Das wichtigste Prinzip, um ...
Eine einfach verkettete Liste kann nur vom Anfang...
Verwenden Sie die For-Schleife, um das Zabbix-Ima...
Inhaltsverzeichnis Vorwort Anwendung Filter Ziehe...