Heim  >  Artikel  >  Datenbank  >  Auslöser des Tutorials zu den neuen Funktionen von MySQL 5.0: Vorlesung 1

Auslöser des Tutorials zu den neuen Funktionen von MySQL 5.0: Vorlesung 1

黄舟
黄舟Original
2016-12-19 16:39:55964Durchsuche

Konventionen und StileKonventionen und Programmierstile

Jedes Mal, wenn ich den tatsächlichen Code demonstrieren möchte, passe ich den Code an, der auf dem MySQL-Client-Bildschirm angezeigt wird, und ändere die Schriftart in Courier, damit sie anders aussehen vom gewöhnlichen Text (jeder soll Programmcode und Text unterscheiden). Hier ist ein Beispiel:


MySQL> Ich füge Kommentare zwischen Zeilen und Absätzen ein und verwende zur Hervorhebung auch das Symbol „<--“ auf der rechten Seite der Seite. Zum Beispiel:

mysql> CREATE PROCEDURE p ()

-> BEGIN

-> ENDE ;//
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Manchmal entferne ich die Systemanzeigen „mysql>“ Sie können den Code direkt hinzufügen Kopieren Sie es in das MySQL-Client-Programm (wenn es sich bei dem, was Sie gerade lesen, nicht um eine elektronische Version handelt, können Sie die entsprechenden Skripte von der Website mysql.com herunterladen)

Alle Beispiele sind bereits in Suse 9.2 Linux und öffentlich Mysql 5.0.3 Der On-Board-Test bestanden. Wenn Sie dieses Buch lesen, verfügt MySQL bereits über eine höhere Version und kann mehr Betriebssysteme unterstützen, darunter Windows, Sparc und HP-UX. Daher laufen die Beispiele hier normal auf Ihrem Computer. Wenn der Vorgang jedoch immer noch fehlschlägt, können Sie einen erfahrenen MySQL-Benutzer konsultieren, den Sie kennen, um besseren Support und Hilfe zu erhalten.

Warum Trigger Warum Trigger verwenden?

Wir haben aus folgenden Gründen Unterstützung für Trigger in MySQL 5.0 integriert:

Benutzer früherer Versionen von MySQL hatten schon lange einen Bedarf an Trigger-Geräten Anforderungen.

Wir haben versprochen, alle ANSI-Standardfunktionen zu unterstützen.

Sie können damit überprüfen oder verhindern, dass fehlerhafte Daten in die Datenbank gelangen.

 Sie können INSERT-, UPDATE- und DELETE-Anweisungen ändern oder abbrechen.

Sie können Datenänderungen in einer Sitzung überwachen.

Hier gehe ich davon aus, dass jeder die erste Folge der „MySQL New Features“-Reihe – „MySQL Stored Procedures“ – gelesen hat. Dann sollte jeder wissen, dass MySQL über gespeicherte Prozeduren und Funktionen verfügt, was ein sehr wichtiges Wissen ist. denn in Triggern können Sie Anweisungen verwenden, die Sie in Funktionen verwenden. Spezielles Beispiel:

Zusammengesetzte Anweisungen (BEGIN / END) sind zulässig.

Flusskontrollanweisungen (IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE, ITERATE) sind ebenfalls zulässig zulässig.

Variablendeklaration (DECLARE) und Zuweisung (SET) sind zulässig.

Ausnahmebehandlungsdeklarationen sind zulässig.

Denken Sie jedoch daran, dass die Funktion Einschränkungen hat: Auf die Tabelle kann in der Funktion nicht zugegriffen werden. Daher ist es illegal, die folgende Anweisung in der Funktion zu verwenden.

ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETE

DROP 'FLUSH PRIVILEGES' GRANT INSERT KILL

LOCK OPTIMIZE REPAIR REPLACE REVOKE


ROLLBACK SAVEPOINT 'SELECT FROM table'

'SET system variable' 'SET TRANSACTION'

SHOW 'START TRANSACTION' TRUNCATE UPDATE

Es gibt genau die gleichen Einschränkungen bei Triggern

Auslöser sind relativ neu, daher wird es (Fehler) geben. Daher möchte ich Sie hier warnen, wie ich es bereits im Stored Procedure-Buch gesagt habe. Verwenden Sie es nicht in einer Datenbank mit wichtigen Daten Fügen Sie diesen Trigger bei Bedarf zu Testzwecken für einige Datenbanken hinzu und stellen Sie sicher, dass diese Datenbanken die Standarddatenbanken sind, wenn Sie den Trigger für die Tabelle erstellen.

Syntax-Syntax

 1. Syntax: Namenssyntax: Benennungsregeln

CREATE TRIGGER <--

{ VORHER | }

{ INSERT |. UPDATE |. DELETE }

ON FÜR JEDE Zeile



Der Trigger muss den Namen haben, bis zu 64 Zeichen, gefolgt von einem Trennzeichen. Es ähnelt im Grunde der Benennungsmethode anderer Objekte in MySQL.

Ich habe hier die Angewohnheit, den Namen der Tabelle + „_“ + Abkürzung des Triggers zu verwenden Wenn es sich also um die Tabelle t26 handelt, der Auslöser VOR dem Ereignis UPDATE liegt (siehe Punkte (2) und (3) unten), dann lautet sein Name t26_bu.

 2. Syntax: Zeit Syntax: Triggerzeit

TRIGGER ERSTELLEN

{ VORHER | NACH } <--

{ Einfügen | Ereignis.

 3. Syntax: Ereignissyntax: Ereignis



CREATE TRIGGER
{ VORHER |. DELETE } < --
ON
FÜR JEDE Zeile

Sie können auch ausgelöste Ereignisse festlegen: Sie können während der Ausführung ausgeführt werden. Ausgelöst beim Einfügen, Aktualisieren oder löschen.

4. Syntax: Tabelle Syntax: Tabelle


ERSTELLEN SIE TRIGGER
{ VORHER |


Der Trigger gehört zu einer bestimmten Tabelle: Wenn ein Einfüge-, Aktualisierungs- oder Löschvorgang für diese Tabelle ausgeführt wird, wird der Trigger aktiviert.
Wir können nicht zwei anordnen Trigger für dasselbe Ereignis in derselben Tabelle.

 5. Syntax: Granularität Syntax: ( : (Schrittgröße) Triggerintervall

CREATE TRIGGER

{ VOR | NACH }

{ EINFÜGEN |. UPDATE |. DELETE }
ON
FOR EACH ROW <--


Trigger, um jede zweite Zeile eine Aktion auszuführen, anstatt nur einmal für die gesamte Tabelle 🎜>{ INSERT |. UPDATE |.
ON

FOR EACH ROW

--

Der Trigger enthält die SQL-Anweisung für ausgelöst werden: Die Anweisung hier kann eine beliebige rechtliche Anweisung sein, einschließlich zusammengesetzter Anweisungen, aber die Anweisung hier unterliegt den gleichen Einschränkungen wie die Funktion >Privilegienberechtigungen

Sie müssen über erhebliche Berechtigungen verfügen, um einen Auslöser zu erstellen (CREATE Wenn Sie bereits Root-Benutzer sind, ist dies ein Unterschied zum SQL-Standard, und ich hoffe, dass Sie ihn in der nächsten Version von MySQL ändern können werden höchstwahrscheinlich eine neue Berechtigung namens CREATE TRIGGER sehen und diese dann über diese Methode erteilen:


GRANT CREATE TRIGGER ON

TO ;

Sie können Berechtigungen auch wie folgt widerrufen:

REVOKE CREATE TRIGGER ON

FROM ;

Bezug auf ALTE und NEUE Spaltenidentifikation von alten und neu erstellten Spalten

In der SQL-Anweisung des Triggers können Sie jede Spalte in der Tabelle in Beziehung setzen, aber Sie können nicht einfach den Namen der Spalte verwenden, um sie zu identifizieren, da dies zu Verwirrung führt Da es möglicherweise einen neuen Namen für die Spalte gibt (den Sie möglicherweise ändern möchten, und Ihre Aktion möglicherweise genau darin besteht, den Spaltennamen zu ändern), ist der alte Name der Spalte weiterhin vorhanden muss diese Syntax verwenden, um Folgendes zu identifizieren:

 "NEW . Column_name" oder "OLD . Column_name". Dies wird technisch gehandhabt (NEW | OLD . Column_name). Die neuen und alten Spaltennamen gehören zu den erstellten Übergangsvariablen (" Übergangsvariablen").

Für die INSERT-Anweisung ist nur NEW zulässig; für die DELETE-Anweisung ist nur OLD zulässig und die UPDATE-Anweisung kann gleichzeitig mit NEW und OLD verwendet werden. Das Folgende ist ein Beispiel für die gleichzeitige Verwendung von NEW und OLD in UPDATE.

TRIGGER t21_au ERSTELLEN

VOR DEM UPDATE AUF t22

FÜR JEDE ZEILE
BEGIN

SET @old = OLD .

SET @new = NEW.s1 ;

END;//

Wenn nun der Wert der Spalte s1 in der Tabelle t21 55 ist, dann wird der Wert von @old nach der Ausführung von „UPDATE t21 SET s1 = s1 + 1“ zu 55. . Und der Wert von @new wird 56.

Beispiel für CREATE und INSERT Das Symbol wurde auf // (DELIMITER //) gesetzt.

TABELLE t22 (s1 INTEGER) ERSTELLEN//

TRIGGER t22_bi ERSTELLEN
VOR EINFÜGEN AUF t22
FÜR JEDE Zeile
BEGINNEN
@x festlegen = 'Trigger wurde aktiviert!';
SET NEW.s1 = 55;

END;//

Zu Beginn habe ich eine Tabelle mit dem Namen t22 erstellt und sie dann auf Tabelle t22 als Trigger erstellt t22_bi wird erstellt. Wenn wir eine Zeile in die Tabelle einfügen möchten, wird der Trigger aktiviert und führt die Aktion aus, den Wert der Spalte s1 auf 55 zu ändern.

 INSERT in einer Tabelle mit einem Trigger verwendet einen Trigger, um die Einfügeaktion auszuführen

mysql> INSERT INTO t22 VALUES (1)//

Lassen Sie uns sehen, ob Was passiert mit der Tabelle, die dem Auslöser des Einfügens einer Datenzeile in Tabelle t2 entspricht?

Die hier eingefügte Aktion ist sehr häufig und wir benötigen keine Triggerberechtigungen, um sie auszuführen. Sie müssen nicht einmal wissen, ob ein Auslöser damit verbunden ist.



mysql> SELECT @x, t22.* FROM t22//
+----------------------- +------+
|. s1 |
+---------+---- --+
|. 55 |

+--------+

1 Zeile im Satz (0,00 Sek.)

Sie können das Ergebnis nach der INSERT-Aktion sehen. Wie erwartet wurde die x-Markierung geändert und die hier eingefügten Daten sind nicht die, die wir eingegeben haben Anfangsdaten, sondern die eigenen Daten des Triggers.

Beispiel für eine „Check“-Einschränkung
Beispiel für eine „Check“-Integritätseinschränkung

 Was ist eine „Check“-Einschränkung? Was ist eine „Check“-Einschränkung?

Im Standard In der SQL-Sprache können wir „CHECK (Bedingung)“ beim Erstellen einer Tabelle (CREATE TABLE) verwenden,

Zum Beispiel:


TABELLE t25 ERSTELLEN
(s1 INT, s2 CHAR(5), PRIMARY KEY (s1),
CHECK (LEFT(s2,1)='A'))
ENGINE= INNODB;

Hier bedeutet CHECK „Wenn das Zeichen ganz links in Spalte s2 nicht ‚A‘ ist, sind sowohl Einfüge- als auch Aktualisierungsanweisungen illegal.“ Ich persönlich hoffe, dass dies unterstützt wird. Wenn Sie eine solche Funktion jedoch wirklich in der Tabelle verwenden müssen, empfehle ich Ihnen, Trigger zu verwenden, um dies zu erreichen.


TABELLE t25 ERSTELLEN
(s1 INT, s2 CHAR(5),
PRIMÄRSCHLÜSSEL (s1))
ENGINE=INNODB//

TRIGGER ERSTELLEN t25_bi
VOR EINFÜGEN AUF t25
FÜR JEDE REIHE
IF LEFT(NEW.s2,1)<>'A' THEN SET NEW.s1=0;//

TRIGGER t25_bu ERSTELLEN
VOR DEM UPDATE AUF t25
FÜR JEDE ZEILE
IF LEFT(NEW.s2,1)<>'A' THEN SET NEW.s1=0;//

Ich muss nur die Anweisungen BEFORE INSERT und BEFORE UPDATE verwenden. Das Löschen des Triggers hat keine Auswirkungen auf die Tabelle. Gleichzeitig kann der AFTER-Trigger die NEUEN Prozessvariablen (Übergangsvariablen) nicht ändern. Um den Trigger zu aktivieren, habe ich Daten mit s1=0 in die Zeilen in der Tabelle eingefügt. Danach schlägt jede Aktion fehl, die die Bedingung LEFT(s2,1) <> erfüllt 🎜>

INSERT INTO t25 VALUES (0,'a') /* Pumpe vorbereiten */ //

INSERT INTO t25 VALUES (5,'b') /* erhält Fehler '23000' */ //

Glauben Sie nicht dem alten MySQL-Handbuch.

Es ist Zeit, das alte MySQL-Handbuch aufzugeben.


Ich möchte Sie hier warnen, nicht zu glauben, was im alten MySQL-Handbuch stand. Wir haben die falschen Aussagen zu Triggern entfernt, aber es sind noch viele alte Versionen des Handbuchs online. Dies ist beispielsweise eine deutsche URL:

http://dev.mysql.com/doc /mysql/de/ANSI_diff_Triggers.html.


In diesem Handbuch heißt es, dass Trigger gespeicherte Prozeduren sind. Sie haben es bereits gesehen.

Im Handbuch heißt es auch, dass Trigger aus anderen Tabellen gelöscht oder ausgelöst werden können, wenn Sie eine Transaktion löschen. Was auch immer er meint, vergessen Sie es, MySQL wird dies nicht implementieren.

Abschließend ist es auch falsch zu sagen, dass die Verwendung von Triggern einen Einfluss auf die Abfragegeschwindigkeit hat. Trigger haben keinen Einfluss auf Abfragen.

 Bugs

 (schlechte Dinge werden nicht übersetzt)

 Am 14. Dezember 2004 habe ich in http://bugs.mysql.com eine „Erweiterte Suche“ nach „trigger“ oder „Auslöser“, ich habe festgestellt, dass es zu diesem Zeitpunkt 17 aktive Fehler gab. Natürlich könnten sie verschwinden, bevor Sie dies lesen, aber für den Fall, dass dies nicht der Fall ist, werde ich die wichtigen erwähnen Sie sind immer noch
da, Sie müssen sie umgehen, wenn Sie Trigger ausprobieren.


Bug#5859 DROP TABLE löscht keine Trigger.
Wenn Sie eine Tabelle löschen , das Löschen der Trigger der Tabelle sollte automatisch erfolgen.


Bug#5892 Trigger haben den falschen Namespace.
Der Namespace ist falsch. Sie müssen den Namen der Tabelle davor hinzufügen, um den Trigger zu löschen. Das Folgende ist ein Beispiel)
 Sie müssen „DROP TRIGGER

. “ sagen.

Die richtige Art und Weise ist „DROP TRIGGER “.



Bug#5894 Trigger mit geänderten Tabellen führen zu beschädigten Datenbanken)
 Ändern Sie keine Tabelle, auf der sich ein Trigger befindet, bis Sie wissen, dass dies behoben ist.

Fazit Abschließend

Am Ende des Buches glaube ich nicht, dass es nötig ist, es noch einmal zu lesen oder noch einmal durchzuleben, weil ich glaube, dass Sie sich leicht an das erinnern können, was ich oben gesagt habe.

Das Obige ist das MySQL 5.0-Tutorial für neue Funktionen. Auslöser: Der Inhalt der ersten Vorlesung. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn