Detaillierte Erläuterung der Idee des MySQL-Triggers zur Echtzeiterkennung einer Anweisung zum Sichern und Löschen

Detaillierte Erläuterung der Idee des MySQL-Triggers zur Echtzeiterkennung einer Anweisung zum Sichern und Löschen

Problembeschreibung: Der Benutzer hat die Anforderung, dass von Zeit zu Zeit ein Feld mit dem Wort „Verstoß“ in einer Tabelle erscheint, und der Benutzer muss die gesamte Datenzeile löschen, wenn dieses Feld erscheint. Dies ist eine Sammelaufgabe. Wenn Daten gefunden werden, die das Wort „Verstoß“ enthalten, werden sie einheitlich zu jeder Stunde oder zu einer bestimmten Zeit gemeldet. Es gibt keine Möglichkeit, die Quelle zu kontrollieren, um die Generierung solcher Daten zu verhindern.

Nun müssen wir folgende Voraussetzungen erfüllen:

1. Erkennen Sie die Generierung dieser Daten in Echtzeit und löschen Sie sie nach der Entdeckung

2. Sichern Sie diese Daten, bevor Sie sie löschen

Lösung:

Es bedarf einer klaren Lösung.

1. Zunächst einmal: Wie kann eine Löschung in Echtzeit erkannt werden? Fragen Sie den Entwickler, ob die Daten durch Einfügen generiert werden. Dann können Sie einen Trigger erstellen, um die Daten beim Einfügen in die Tabelle zu löschen.

2. Wie führe ich eine Sicherung durch? Welche Methode zum Sichern? Kann die Sicherung in einer Tabelle durchgeführt werden, die den Zeitpunkt jeder Einfügung aufzeichnet? Die Sicherungstabelle kann grundsätzlich dieselbe Struktur wie die ursprüngliche Tabelle haben, aber die Autoinkrementattribute, der Primärschlüssel, der Fremdschlüssel und andere Attribute der ursprünglichen Tabelle müssen aus der Sicherungstabelle gelöscht und ein Zeitstempelfeld hinzugefügt werden, um die Aufzeichnung des Zeitpunkts jeder Sicherungsdatei zu erleichtern. Die oben genannten Attribute werden gelöscht, um Daten in die Sicherungstabelle schreiben zu können.

3. Wie erstelle ich vor dem Löschen ein Backup? Ich dachte zunächst, ich könnte es einfach in einen Trigger einfügen, zuerst die Daten sichern und sie anschließend löschen, aber beim Testen funktionierte das nicht.

Testplan:

Bereiten Sie zunächst einige Testdaten und Testtabellen vor

1. Testdaten erstellen

mysql> zeigen, Tabelle erstellen, Student;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Tabelle | Tabelle erstellen |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Student | CREATE TABLE `Student` (
  `Sno` char(9) NICHT NULL,
  `Sname` char(20) NICHT NULL,
  `Ssex` char(2) DEFAULT NULL,
  `Sage` smallint DEFAULT NULL,
  `Sdept` char(20) DEFAULT NULL,
  PRIMÄRSCHLÜSSEL (`Sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 Zeile im Satz (0,01 Sek.)

2. Erstellen Sie eine Sicherungstabelle. Überprüfen Sie die Anweisung zur Tabellenerstellung. Die formale Umgebung kennt die Tabellenstruktur der Originaltabelle nicht. Es ist erforderlich, die ursprüngliche Tabellenstruktur zu ändern und eine neue Sicherungstabelle zu erstellen.

Ursprüngliche Anweisung zur Tabellenerstellung

mysql> zeigen, Tabelle erstellen, Student;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Tabelle | Tabelle erstellen |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Student | CREATE TABLE `Student` (
  `Sno` char(9) NICHT NULL,
  `Sname` char(20) NICHT NULL,
  `Ssex` char(2) DEFAULT NULL,
  `Sage` smallint DEFAULT NULL,
  `Sdept` char(20) DEFAULT NULL,
  PRIMÄRSCHLÜSSEL (`Sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 Zeile im Satz (0,01 Sek.)

3. Backup-Anweisungen vorbereiten, Anweisungen löschen und Testanweisungen einfügen

Backup-Anweisung (da die Backup-Tabelle ein zusätzliches Zeitstempelfeld hat, muss die Backup-Anweisung geändert werden)

mysql> anzeigen, Tabelle student_bak erstellen;
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Tabelle | Tabelle erstellen |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| student_bak | CREATE TABLE `student_bak` (
`Sno` char(9) NICHT NULL,
`Sname` char(20) NICHT NULL,
`Ssex` char(2) DEFAULT NULL,
`Sage` smallint DEFAULT NULL,
`Sdept` char(20) DEFAULT NULL,
`create_date` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 Zeile im Satz (0,00 Sek.)

Backup-Effekt

Testanweisung einfügen:

in Studentenwerte einfügen ('201215124', 'Zweit', 'Zweit', 20, 'EL');

Löschanweisung (achten Sie darauf, die Löschanweisung genau zu formulieren und zu belegen, was Sie löschen möchten)

Löschen aus Student, wobei Sdept = "EL" ist;

4. Tatsächlicher Testplan

4.1 Zwei Anweisungen in einen Trigger schreiben (Operation fehlgeschlagen, Logikausführung fehlgeschlagen)

Trigger löschen, falls vorhanden, Testtrigger;
TRENNUNGSZEICHEN $
TRIGGER ERSTELLEN test_trigger
NACH
INSERT ON student2
FÜR JEDE REIHE
BEGINNEN
einfügen in student_bak(Sno, Sname, Ssex, Sage, Sdept) auswählen * von Student, wobei Sdept='EL';
Löschen aus Student, wobei Sdept = "EL" ist;
ENDE $
TRENNUNGSZEICHEN ;

4.2 Bereiten Sie zwei separate Auslöser vor. Einer besteht darin, die Daten in die Sicherungstabelle einzufügen, um den Sicherungseffekt zu erzielen, wenn die Daten in der Originaltabelle erscheinen. Der zweite Trigger besteht darin, einen Trigger zum Löschen der Daten in der Originaltabelle zu erstellen, nachdem die Daten in der Sicherungstabelle gesichert wurden. Anschließend wird der Löscheffekt nach der Sicherung erzielt (der Vorgang schlägt immer noch fehl) und die Ausführung meldet einen Fehler, der besagt, dass ein Triggerkonflikt oder etwas Ähnliches vorliegt. Dadurch wird die Datenbank über die Ausführungslogik nicht informiert.

4.3 Erstellen Sie einen Trigger, der die Zieldaten in der Originaltabelle löscht und die Daten dann in der Sicherungstabelle sichert. Schließlich müssen wir nur noch die Zieldaten in Echtzeit erkennen und löschen. Wir sind nicht auf das Trigger-Denken beschränkt. Wir können einfach eine geplante Aufgabe ausführen (der Vorgang ist erfolgreich).

Wenn im folgenden Test beispielsweise ein Feld mit dem Namen „EL“ im Feld „Sdept“ in der Datenbanktabelle erscheint, muss die gesamte Datenzeile gelöscht werden.

Trigger löschen, falls student_bak_trigger vorhanden ist;
TRENNUNGSZEICHEN $
TRIGGER ERSTELLEN student_bak_trigger 
VOR 
LÖSCHEN BEIM Schüler 
FÜR JEDE REIHE 
BEGINNEN   
einfügen in student_bak(Sno,Sname,Ssex,Sage,Sdept) auswählen * von Student, wobei Sdept='EL';
ENDE $
TRENNUNGSZEICHEN ;

Dieser Trigger wird implementiert. Wenn die Zieldaten in der Originaltabelle gelöscht werden, wird der Trigger ausgelöst, um die Daten zu sichern.

mysql> wähle * vom Studenten aus;
+-----------+--------+------+------+---------+----------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----------+--------+------+------+---------+----------+
| 201215121 | Li Yong | Männlich | 20 | CS |
| 201215122 | Liu Chen | Weiblich | 19 | CS |
| 201215123 | Wang Min | Weiblich | 18 | MA |
| 201215130 | Soldat | Männlich | 20 | CH |
+-----------+--------+------+------+---------+----------+
4 Zeilen im Satz (0,00 Sek.)

mysql> wähle * aus student_bak;
+-----------+--------+------+----------+---------------------+
| Sno | Sname | Ssex | Sage | Sdept | Erstelldatum |
+-----------+--------+------+----------+---------------------+
| 201215124 | Zhang San | Männlich | 20 | EL | 18.09.2021 15:42:20 |
+-----------+--------+------+----------+---------------------+
1 Zeile im Satz (0,00 Sek.)

mysql> in Studentenwerte einfügen('201215125','Nein','Nein',30,'EL');
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)

mysql> wähle * vom Studenten aus;
+-----------+--------+------+------+---------+----------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----------+--------+------+------+---------+----------+
| 201215121 | Li Yong | Männlich | 20 | CS |
| 201215122 | Liu Chen | Weiblich | 19 | CS |
| 201215123 | Wang Min | Weiblich | 18 | MA |
| 201215125 | Wang Wu | Männlich | 30 | EL |
| 201215130 | Soldat | Männlich | 20 | CH |
+-----------+--------+------+------+---------+----------+
5 Zeilen im Satz (0,00 Sek.)

mysql> wähle * aus student_bak;
+-----------+--------+------+----------+---------------------+
| Sno | Sname | Ssex | Sage | Sdept | Erstelldatum |
+-----------+--------+------+----------+---------------------+
| 201215124 | Zhang San | Männlich | 20 | EL | 18.09.2021 15:42:20 |
+-----------+--------+------+----------+---------------------+
1 Zeile im Satz (0,00 Sek.)

mysql> löschen von Student, wobei Sdept = "EL" ist;
Abfrage OK, 1 Zeile betroffen (0,01 Sek.)

mysql> wähle * aus student_bak;
+-----------+--------+------+----------+---------------------+
| Sno | Sname | Ssex | Sage | Sdept | Erstelldatum |
+-----------+--------+------+----------+---------------------+
| 201215124 | Zhang San | Männlich | 20 | EL | 18.09.2021 15:42:20 |
| 201215125 | Wang Wu | Männlich | 30 | EL | 18.09.2021 15:47:28 |
+-----------+--------+------+----------+---------------------+
2 Zeilen im Satz (0,00 Sek.)

Implementieren Sie abschließend eine geplante Aufgabe, um die gesamte Datenzeile in einem Feld namens „EL“ zyklisch zu löschen. Die geplante Aufgabe ist hier global und der Datenbankname und der spezifische Tabellenname müssen hinzugefügt werden. Die Ausführungsgeschwindigkeit der geplanten Aufgabe kann manuell angepasst werden. Im Folgenden wird 3 s/Zeit angegeben, um den gewünschten Effekt zu erzielen.

Ereignis erstellen, falls nicht vorhanden e_test_event
planmäßig alle 3 Sekunden 
nach Fertigstellung bewahren
Löschen Sie aus abc.student, wo Sdept='EL';

Geplante Aufgaben deaktivieren:

mysql> Ereignis „e_test_event“ bei Abschluss ändern, deaktivieren und bewahren;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Geplante Aufgaben anzeigen:

mysql> select * from information_schema.events\G;**************************** 4. Zeile ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: abc
          EVENT_NAME: e_test_event
             DEFINIERER: root@%
           ZEITZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: Löschen aus abc.student, wobei Sdept='EL'
          EVENT_TYPE: WIEDERKEHREND
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 3
      INTERVAL_FIELD: SEKUNDE
            SQL_MODE: NUR_VOLLSTÄNDIGE_GRUPPE_NUR, STRENGE_TRANS_TABELLEN, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER_FÜR_DIVISION_DURCH_NULL, KEINE_ENGINE_SUBSTITUTION
              BEGINNT: 2021-09-17 13:35:44
                ENDE: NULL
              STATUS: AKTIVIERT
       ON_COMPLETION: BEWAHREN
             ERSTELLT: 2021-09-17 13:35:44
        LAST_ALTERED: 2021-09-17 13:35:44
       LETZTE AUSFÜHRUNG: 2021-09-18 15:43:35
       EVENT_COMMENT: 
          Urheber: 3330614
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4_0900_ai_ci
  DATABASE_COLLATION: utf8mb4_0900_ai_ci
4 Zeilen im Satz (0,00 Sek.)

Auslöser anzeigen:

mysql> wähle * aus information_schema.triggers\G;
*************************** 5. Reihe ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: abc
              TRIGGER_NAME: student_bak_trigger
        EVENT_MANIPULATION: LÖSCHEN
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: abc
        EVENT_OBJECT_TABLE: Student
              AKTION_ORDER: 1
          ACTION_CONDITION: NULL
          ACTION_STATEMENT: BEGIN   
einfügen in student_bak(Sno,Sname,Ssex,Sage,Sdept) auswählen * von Student, wobei Sdept='EL';
ENDE
        ACTION_ORIENTATION: REIHE
             ACTION_TIMING: VORHER
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
  ACTION_REFERENCE_OLD_ROW: ALT
  ACTION_REFERENCE_NEW_ROW: NEU
                   ERSTELLT: 2021-09-18 15:41:48.53
                  SQL_MODE: NUR_VOLLSTÄNDIGE_GRUPPE_NUR, STRENGE_TRANS_TABELLEN, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER_FÜR_DIVISION_DURCH_NULL, KEINE_ENGINE_SUBSTITUTION
                   DEFINIERER: root@%
      CHARACTER_SET_CLIENT: utf8mb4
      COLLATION_CONNECTION: utf8mb4_0900_ai_ci
        DATABASE_COLLATION: utf8mb4_0900_ai_ci
5 Zeilen im Satz (0,00 Sek.)

Ergebnis:

Dies ist das Ende dieses Artikels mit der detaillierten Erklärung der Idee der Echtzeiterkennung einer Anweisung zum Sichern und Löschen durch MySQL-Trigger. Weitere relevante Inhalte zum Sichern und Löschen durch MySQL-Trigger finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Themenverfeinerung für MySQL-Ereignisse und -Trigger
  • MySQL-Datenbank-Trigger vom Anfänger bis zum Profi
  • Erste Schritte mit gespeicherten Prozeduren, Triggern und Ereignisplanern in MySQL
  • Detaillierte Erläuterung des MySQL-Trigger-Trigger-Beispiels
  • Einführung in die Verwendung sowie Vor- und Nachteile von MySQL-Triggern
  • Verwendung von MySQL-Triggern
  • Ein Artikel, der Ihnen ein tiefes Verständnis von Mysql-Triggern vermittelt
  • Verwendung von MySQL-Triggern
  • Verwendung von MySQL-Triggern einfach erklärt

<<:  Detaillierte Erläuterung von vier Lösungen für schwebende Probleme im CSS-Layout

>>:  Detaillierte Erläuterung der Javascript-Ereigniserfassungs- und Bubbling-Methoden

Artikel empfehlen

Ubuntu16.04 Installation mysql5.7.22 Grafik-Tutorial

Installations-Tutorial für VMware12.0+Ubuntu16.04...

So installieren Sie die Linux-Onlinesoftware gcc online

Befehle zur Linux-Onlineinstallation: yum install...

Detaillierte Erläuterung der Vue-Projektverpackung

Inhaltsverzeichnis 1. Zugehörige Konfiguration Fa...

CSS Lieferadresse Parallelogramm Linienstil Beispielcode

Der Code sieht folgendermaßen aus: // Linienstil ...

CSS-Layout-Tutorial: So erreichen Sie eine vertikale Zentrierung

Vorwort Ich habe kürzlich mein Front-End-Wissen z...

So verwenden Sie residente Knoten für die Ebenenverwaltung in CocosCreator

CocosCreator-Version: 2.3.4 Die meisten Spiele ve...

JS generiert eindeutige ID-Methoden: UUID und NanoID

Inhaltsverzeichnis 1. Warum NanoID UUID ersetzt 2...

Detaillierte Erläuterung der Verwendung des Linux-Zeitbefehls

1. Befehlseinführung Mit „time“ werden die für di...

Vergessen Sie nicht, den HTML-Tag zu schließen

Das Erstellen von Webseiten, die Webstandards ents...

Einige Vorschläge für HTML-Anfänger und Neulinge, Experten können sie ignorieren

Gefühle: Ich bin Backend-Entwickler. Manchmal fühl...

Zehn wichtige Fragen zum Erlernen der Grundlagen von Javascript

Inhaltsverzeichnis 1. Was ist Javascript? 2. Was ...

JavaScript zum Erreichen eines einfachen Seiten-Countdowns

In diesem Artikelbeispiel wird der spezifische Ja...