Datenbankauslöser
A Datenbankauslöser ist Verfahrenskodex das wird automatisch als Antwort auf bestimmte Ausführung ausgeführt Veranstaltungen auf einem bestimmten Tisch oder Aussicht in einem Datenbank. Der Auslöser wird hauptsächlich zur Aufrechterhaltung des Integrität der Informationen über die Datenbank. Wenn beispielsweise ein neuer Datensatz (der einen neuen Arbeiter darstellt) in die Tabelle der Mitarbeiter hinzugefügt wird, sollten auch in den Tabellen der Steuern, Urlauben und Gehälter neue Aufzeichnungen erstellt werden. Auslöser können auch verwendet werden, um historische Daten zu protokollieren, um beispielsweise die früheren Gehälter der Mitarbeiter zu verfolgen.
Auslöser in DBMs
Im Folgenden folgt eine Reihe von Beschreibungen, wie einige beliebt sind DBMs Unterstützungsauslöser.
Orakel
Zusätzlich zu Triggern, die feuern (und ausführen PL/sql Code) Wenn Daten geändert werden, Oracle 10g Unterstützt Auslöser, die feuern, wenn Objekte auf Schema-Ebene (dh Tabellen) geändert werden und wenn Benutzeranmeldungen oder Anmeldungen auftreten.
Auslöser auf Schema-Ebene
- Nach der Schöpfung
- Vor Alter
- Nach Alter
- Vor dem Drop
- Nach dem Drop
- Vor dem Einfügen
Die vier Haupttypen von Triggern sind:
- Auslöser auf Zeilenebene: Dies wird vor oder danach ausgeführt Jeder Spaltenwert einer Zeile Änderungen
- Auslöser auf Spaltenebene: Dies wird vor oder nach dem ausgeführt angegebene Spalte Änderungen
- Für jeden Zeilentyp: Dieser Auslöser wird für jede Zeile der Zeile einmal ausgeführt Ergebnisset betroffen von einem Einfügen/Update/Löschen
- Für jeden Anweisungsart: Dieser Auslöser wird nur einmal für das gesamte Ergebnissatz ausgeführt, aber auch jedes Mal, wenn die Anweisung ausgeführt wird.
Auslöser auf Systemebene
Aus Oracle 8i, Datenbankereignisse - Anmeldungen, Anmeldungen, Startups - können Oracle -Trigger abfeuern.[1]
Microsoft SQL Server
Eine Liste aller verfügbaren Entlassungsereignisse in Microsoft SQL Server für DDL -Trigger ist auf Microsoft Docs.[2]
Die Durchführung von bedingten Aktionen in Triggern (oder Testdaten nach Änderung) erfolgt durch den Zugriff auf den temporären Zugriff Eingefügt und Gelöscht Tische.
PostgreSQL
Einführung der Unterstützung für Trigger im Jahr 1997. Die folgende Funktionalität in SQL: 2003 wurde bisher nicht in PostgreSQL implementiert:
- SQL ermöglicht Auslöser, Updates für bestimmte Spalten abzunehmen. Ab Version 9.0 von PostgreSQL wird diese Funktion auch in PostgreSQL implementiert.
- Der Standard ermöglicht die Ausführung einer Reihe anderer SQL -Anweisungen als AUSWÄHLEN, EINFÜGUNG, AKTUALISIEREN, wie z. B. Tabelle als ausgelöste Aktion erstellen. Dies kann durch das Erstellen einer gespeicherten Prozedur oder Funktion zum Aufrufen von Create -Tabellen erfolgen.[3]
Zusammenfassung:
SCHAFFEN ABZUG Name { VOR | NACH } { Veranstaltung [ ODER ... ] } AN TISCH [ ZUM [ JEDER ] { DIE ZEILE | AUSSAGE } ] AUSFÜHREN VERFAHREN Funktionsname ( Argumente )
Feuervogel
Feuervogel Unterstützt mehrere Zeilenebene vor oder nach, fügen Sie, aktualisieren, löschen (oder eine beliebige Kombination von davon) pro Tabelle, wo sie immer "zusätzlich zu" die Standardtabelle ändert, und die Reihenfolge der Trigger relativ zueinander Kann angegeben werden, wo es sonst nicht mehrdeutig wäre (Positionsklausel.) Auslöser können auch auf Ansichten vorhanden sein, wo sie immer "statt" Auslöser "sind und die Standard -Aktualisierungslogik der Aktualisierungsansicht ersetzen. (Vor Version 2.1 werden Auslöser für aktualisierbare Ansichten zusätzlich zur Standardlogik ausgeführt.)
Firebird erhöht keine Mutating -Tabellenausnahmen (wie Oracle), und Trigger werden standardmäßig sowohl Nest als auch nach Bedarf wieder aufnehmen ,) und Bereitstellung von Flags mit Aktualisierungen, Einfügen und Löschen, um die aktuelle Verwendung des Auslösers anzuzeigen.
{SCHAFFEN | Neu erstellen | SCHAFFEN ODER ÄNDERN} ABZUG Name ZUM {Tisch Name | Aussicht Name} [AKTIV | INAKTIV] {VOR | NACH} {EINFÜGUNG [ODER AKTUALISIEREN] [ODER LÖSCHEN] | AKTUALISIEREN [ODER EINFÜGUNG] [ODER LÖSCHEN] | LÖSCHEN [ODER AKTUALISIEREN] [ODER EINFÜGUNG] } [POSITION n] WIE START .... ENDE
Ab Version 2.1 unterstützt Firebird zusätzlich die folgenden Auslöser auf Datenbankebene:
- Verbindung (Ausnahmen hier, die hier erhoben werden, verhindern, dass die Verbindung abgeschlossen wird)
- TRENNEN
- Transaktionsstart
- Transaktionsausschüsse (Ausnahmen hier verhindern, dass die Transaktion die Begehung des Transaktions bezieht oder sich vorbereitet, wenn ein Zweiphasen-Commit beteiligt ist)
- Transaktionsrollback
Datenbank-Ebene-Trigger können dazu beitragen, Multi-Table-Einschränkungen durchzusetzen oder zu emulieren materialisierte Aussichten. Wenn eine Ausnahme in einem Transaktionsausschüttungsauslöser erhöht wird, werden die bisherigen Änderungen des Triggers zurückgerollt und die Client -Anwendung benachrichtigt, die Transaktion bleibt jedoch aktiv, als ob das Komitee nie angefordert worden wäre. Die Client-Anwendung kann weiterhin Änderungen vornehmen und das Komitee wiederholen.
Syntax für Datenbankauslöser:
{SCHAFFEN | Neu erstellen | SCHAFFEN ODER ÄNDERN} ABZUG Name [AKTIV | INAKTIV] AN {VERBINDEN | TRENNEN | TRANSAKTION ANFANG | TRANSAKTION VERPFLICHTEN | TRANSAKTION Rollback} [POSITION n] WIE START ..... ENDE
Mysql/Mariadb
Begrenzte Unterstützung für Auslöser in MySQL/Mariadb DBMs wurde in der 5.0 -Version von MySQL hinzugefügt, die 2005 gestartet wurde.[4]
Ab Version 8.0 ermöglichen sie DDL -Trigger (Datendarstellungssprache) und für DML -Auslöser (Datenmanipulationssprache). Sie ermöglichen auch, dass entweder der DDL -Trigger (nach oder vor) entweder DDL -Trigger verwendet wird, um Auslöser zu definieren. Sie werden mit der Klausel erstellt Trigger erstellen und gelöscht mit der Klausel Tropfenauslöser. Die auf ein Ereignis geforderte Erklärung wird nach der Klausel definiert FÜR JEDE REIHE, gefolgt von einem Schlüsselwort (EINSTELLEN oder START), was angibt, ob das, was folgt, ein Ausdruck bzw. eine Aussage ist.[5]
IBM db2 luw
IBM DB2 für verteilte Systeme, die als DB2 für LUW bekannt sind (LUW -Mittelwerte LInux, UNix, WIndows) unterstützt drei Triggertypen: Vor dem Trigger, nach dem Auslöser und anstelle von Trigger. Sowohl Auslöser der Statement -Ebene als auch Zeilenebene werden unterstützt. Wenn mehr Auslöser für denselben Betrieb in der Tabelle vorhanden sind, wird die Brandordnung durch Trigger -Erstellungsdaten bestimmt. Seit Version 9.7 IBM DB2 unterstützt autonome Transaktionen.[6]
Vor dem Auslöser dient zum Überprüfen von Daten und zur Entscheidung, ob der Betrieb zulässig sein sollte. Wenn eine Ausnahme vor dem Auslöser ausgelöst wird, wird der Betrieb abgebrochen und es werden keine Daten geändert. In DB2 vor Triggern werden nur gelesen - Sie können Daten vor Triggern nicht ändern. Nachdem Trigger für die Nachbearbeitung ausgelegt sind, nachdem eine Änderung gefordert wurde. Nach Auslöser können Daten in Tabellen schreiben und im Gegensatz zu einigen[die?] Andere Datenbanken, die Sie in eine beliebige Tabelle schreiben können, einschließlich der Tabelle, in der der Trigger funktioniert. Anstelle von Auslöser dienen dazu, Ansichten zu schreiben.
Auslöser sind normalerweise in programmiert Sql pl Sprache.
Sqlite
SCHAFFEN [Temperatur | VORÜBERGEHEND] ABZUG [WENN NICHT Existiert] [Name der Datenbank .] Trigger_Name [VOR | NACH | STATTDESSEN VON] {LÖSCHEN | EINFÜGUNG | AKTUALISIEREN [VON Spaltenname [, Spaltenname] ...]} AN {Tabellenname | View_name} [ZUM JEDER DIE ZEILE] [WENN Bedingung ist obligatorisch ] START ... ENDE
Sqlite Unterstützt nur Auslöser auf Reihenebene, keine Auslöser auf Statement-Ebene.
Aktualisierbare Ansichten, die in SQLite nicht unterstützt werden, können mit Auslöser emuliert werden.
XML -Datenbanken
Ein Beispiel für die Implementierung von Triggern in nicht-relationaler Datenbank kann sein Sedna, die Unterstützung für Trigger basierend auf XQuery. Auslöser in SEDNA wurden als analog zu sein SQL: 2003 Auslöser, aber nativ auf XML -Abfrage- und Aktualisierungssprachen basieren (Sprachen (Aktualisieren) (XPath, XQuery und XML -Update -Sprache).
Ein Auslöser in SEDNA wird auf Knoten eines in der Datenbank gespeicherten XML -Dokuments eingestellt. Wenn diese Knoten aktualisiert werden, führt der Trigger XQuery -Abfragen und -aktualisierungen automatisch aus. Beispielsweise storniert der folgende Trigger die Löschung der Personknoten, wenn von dieser Person offene Auktionen verwiesen werden:
SCHAFFEN ABZUG "Trigger3" VOR LÖSCHEN AN doc ("Versteigerung")/Seite? ˅//Person ZUM JEDER KNOTEN TUN { wenn(existiert($WO//Open_auction/Bieter/Personref/@Person=$ALT/@Ich würde)) dann ( ) anders $ALT; }
Zeilen- und Aussagestufe Trigger
Um zu verstehen, wie Triggerverhalten funktioniert, müssen Sie sich der beiden Haupttypen von Triggern bewusst sein. Dies sind Zeilen- und Aussage -Auslöser. Die Unterscheidung zwischen den beiden ist, wie oft der Code innerhalb des Auslösers ausgeführt wird und zu welcher Zeit.
Angenommen, Sie haben einen Auslöser, der auf ein Update auf eine bestimmte Tabelle aufgerufen wird. Zeilenpegelauslöser würden für jede Zeile, die vom Update betroffen ist, einmal ausgeführt. Es ist wichtig zu berücksichtigen, ob der Befehl Update, den Trigger, keine Zeilen betroffen sind wird nicht Führen Sie jeden Code innerhalb des Triggers aus. Auslöser der Statement -Ebene werden einmal aufgerufen trotzdem Wie viele Zeilen vom Update betroffen sind. Hier ist es wichtig zu beachten, dass der Code innerhalb des Triggers auch dann einmal ausgeführt wird, wenn der Befehl update -Befehl keine Zeilen auswirkt.
Verwenden der Vorher und nach Optionen[7] Bestimmen Sie, wann der Auslöser aufgerufen wird. Angenommen, Sie haben einen Auslöser, der auf einen Einsatz in eine bestimmte Tabelle aufgerufen wird. Wenn Ihr Auslöser die Option vor der Option verwendet, wird der Code im Auslöser ausgeführt, bevor der Einfügen in die Tabelle erfolgt. Eine häufige Verwendung des vorbeobachteten Triggers besteht darin, die Eingabewerte des Einfügung zu überprüfen oder die Werte entsprechend zu ändern. Nehmen wir nun an, wir haben einen Auslöser, der stattdessen danach verwendet. Der Code innerhalb des Auslösers wird ausgeführt, nachdem der Einsatz in die Tabelle stattfindet. Ein Beispiel für die Verwendung dieses Auslösers ist die Erstellung eines Prüfungsverlaufs, der Einfügungen in die Datenbank gemacht hat und die vorgenommenen Änderungen im Auge behalten. Wenn Sie diese Optionen verwenden, müssen Sie einige Dinge im Auge behalten. Die vor option macht nicht erlauben Sie können Tabellen ändern. Aus diesem Grund ist die Eingabevalidierung eine praktische Verwendung. Mithilfe von After Trigger können Sie Tabellen wie das Einfügen in eine Prüfungsverlaufstabelle ändern.
Wenn Sie einen Auslöser erstellen, um festzustellen, ob es sich um eine Anweisung oder eine Zeilenebene handelt, fügen Sie einfach die für jede Zeilenklausel für eine Zeilenebene hinzu oder lassen Sie die Klausel für eine Anweisungsstufe weg. Seien Sie vorsichtig, zusätzliche zu verwenden EINFÜGUNG/AKTUALISIEREN/LÖSCHEN Befehle in Ihrem Auslöser, weil Trigger Rekursion ist möglich, was unerwünschtes Verhalten verursacht. In den folgenden Beispielen wird jeder Auslöser eine andere Tabelle ändern, indem Sie untersuchen, was geändert wird, können Sie einige gängige Anwendungen sehen, wenn verschiedene Triggertypen verwendet werden.
Das Folgende ist ein Oracle -Syntax -Beispiel für einen Zeilenpegelauslöser, der nach einem Update für jede betroffene Zeile aufgerufen wird. Dieser Auslöser wird auf eine Aktualisierung einer Telefonbuchdatenbank aufgerufen. Wenn der Trigger genannt wird, fügt er einen Eintrag in eine separate Tabelle mit dem Namen Telefon_Book_audit hinzu. Beachten Sie auch, dass Trigger in der Lage sind, Schemaobjekte wie Sequenzen zu nutzen,[8] In diesem Beispiel wird Audit_id_sequence.nexval verwendet, um eindeutig zu generieren Primärschlüssel In der Tabelle Telefon_book_audit.
SCHAFFEN ODER ERSETZEN ABZUG Telefon_book_audit NACH AKTUALISIEREN AN Telefonbuch ZUM JEDER DIE ZEILE START EINFÜGUNG HINEIN Telefon_book_audit (audit_id,Audit_Change, audit_l_name, audit_f_name, audit_old_phone_number, AUDIT_NEW_PONE_NUMBER, audit_date) WERTE (audit_id_sequence.NextVal,'Aktualisieren', :ALT.Nachname, :ALT.Vorname, :ALT.Telefonnummer, :NEU.Telefonnummer, Sysdate); ENDE;
Jetzt anrufen AKTUALISIEREN Auf der Tabelle Telefon_Book für Personen mit dem Nachnamen 'Jones'.
AKTUALISIEREN Telefonbuch EINSTELLEN Telefonnummer = '111-111-1111' WO Nachname = 'Jones';
Audit_id | Audit_Change | F_Name | L_Name | New_phone_number | Old_phone_number | Audit_date |
---|---|---|---|---|---|---|
1 | Aktualisieren | Jordanien | Jones | 111-111-1111 | 098-765-4321 | 02. Mai-14 |
2 | Aktualisieren | Megan | Jones | 111-111-1111 | 111-222-3456 | 02. Mai-14 |
Beachten Sie, dass die Tabelle Telefon_Number_audit jetzt mit zwei Einträgen gefüllt ist. Dies liegt an der Datenbank mit zwei Einträgen mit dem Nachnamen von 'Jones'. Da das Update zwei separate Zeilenwerte geändert hat, wurde der erstellte Trigger zweimal aufgerufen. einmal nach jeder Modifikation.
After - Auslöser auf Anweisungsebene
Ein Oracle -Syntax -Anweisungsauslöser, der nach einem Update auf die Tabelle Telefon_Book aufgerufen wird. Wenn der Trigger aufgerufen wird, wird ein Einfügen in telefon_book_edit_history table einfügen
SCHAFFEN ODER ERSETZEN ABZUG Telefon_book_history NACH AKTUALISIEREN AN Telefonbuch START EINFÜGUNG HINEIN Telefon_book_edit_history (audit_history_id, Nutzername, Änderung, edit_date) WERTE (audit_history_id_sequence.NextVal, BENUTZER,'Aktualisieren', Sysdate); ENDE;
Jetzt genau das gleiche Update wie das obige Beispiel, diesmal jedoch mit einem Auslöser der Anweisung Level.
AKTUALISIEREN Telefonbuch EINSTELLEN Telefonnummer = '111-111-1111' WO Nachname = 'Jones';
Audit_history_id | Nutzername | Änderung | Edit_date |
---|---|---|---|
1 | Hausschbc | Aktualisieren | 02. Mai-14 |
Das Ergebnis zeigt, dass der Auslöser nur einmal aufgerufen wurde, obwohl das Update zwei Zeilen geändert hat.
Vor jedem - Auslöser auf Reihenebene
Dieses Beispiel zeigt vor jedem Zeilenauslöser, der den Einsatz mit einem bei Bedingung modifiziert. Wenn der Nachname größer als 10 Buchstaben ist, unter Verwendung der Substr -Funktion[9] Wir ändern den Spaltenwert Last_Name in eine Abkürzung.
SCHAFFEN ODER ERSETZEN ABZUG Telefon_book_insert VOR EINFÜGUNG AN Telefonbuch ZUM JEDER DIE ZEILE WENN (LÄNGE(Neu.Nachname) > 10) START :Neu.Nachname := Substr(::Neu.Nachname,0,1); ENDE;
Jetzt einen Einsatz von jemandem mit einem großen Namen durchführen.
EINFÜGUNG HINEIN Telefonbuch WERTE (6, ", 'Erin', "Minneapolis", 'Mn', "989 University Drive", '123-222-4456', 55408, MITEINANDER AUSGEHEN('11/21/19 1991 ', 'MM/DD/JJJJ'));
Person_id | Nachname | Vorname | Stadt | STATE_ABBREVIATION | Adresse | Telefonnummer | Postleitzahl | Dob |
---|---|---|---|---|---|---|---|---|
6 | V | Erin | Minneapolis | Mn | 989 University Drive | 123-222-4456 | 55408 | 21-Nov-91 |
Der Auslöser funktionierte nach dem obigen Ergebnis und modifizierte den Wert des Einsatzes Vor es wurde ausgeführt.
Vorher - Auslöser auf Anweisungsebene
Die Verwendung eines Voransatzauslösers ist besonders nützlich bei der Durchsetzung von Datenbankbeschränkungen.[10] In diesem Beispiel wird gezeigt, wie eine Beschränkung auf jemanden namens "einiger Benutzer" auf dem Table Telefon_Book durchgesetzt werden kann.
SCHAFFEN ODER ERSETZEN ABZUG Hausschbc VOR EINFÜGUNG AN Ein bisschen.Telefonbuch START RAUS_APLICATION_ERROR ( num => -20050, Nachricht => "Die Fehlermeldung geht hier."); ENDE;
Wenn nun "ein Teilnehmer" angemeldet ist, nachdem versucht wird, diese Fehlermeldung einzufügen, wird angezeigt:
SQL-Fehler: ORA-20050: Die Fehlermeldung geht hier.
Benutzerdefinierte Fehler wie diese haben eine Einschränkung, wie die Num -Variable definiert werden kann. Aufgrund der zahlreichen anderen vordefinierten Fehler muss diese Variable im Bereich von -20000 bis -20999 liegen.
Verweise
- ^ Nanda, Arup; Burleson, Donald K. (2003). "9". In Burleson, Donald K. (Hrsg.). Oracle Privacy Security Auditing: Beinhaltet die Einhaltung des Bundesgesetzes mit HIPAA, Sarbanes Oxley und dem Gramm Leach Bliley Act GLB. Oracle In-Focus-Serie. Vol. 47. Kittrell, North Carolina: Rampant Techpress. p. 511. ISBN 9780972751391. Abgerufen 2018-04-17.
[...] Auslöser auf Systemebene [...] wurden in Oracle8i eingeführt. [...] Trigger auf Systemebene werden auf bestimmte Systemereignisse wie Anmeldung, Abmelden, Datenbankstart, DDL-Ausführung und ServerError [...] abgefeuert.
- ^ "DDL -Ereignisse - SQL Server".
- ^ "PostgreSQL: Dokumentation: 9.0: Trigger erstellen". www.postgresql.org. 8. Oktober 2015.
- ^ MySQL 5.0 Referenzhandbuch. "Auslöser. MySQL 5.0 hat eine begrenzte Unterstützung für Trigger hinzugefügt", Oracle Corporation, Abgerufen am 4. März 2020.
- ^ "MySQL :: Mysql 8.0 Referenzhandbuch :: 25.3.1 Triggersyntax und Beispiele".
- ^ "Autonome Transaktionen". www.ibm.com. 30. Juli 2009.
- ^ "6 mit Triggern". docs.oracle.com.
- ^ "Oraces Dokumentation zu Sequenzen". Archiviert vom Original am 2011-12-01.
- ^ "Oracle SQL Funktionen - die vollständige Liste". 26. Dezember 2014.
- ^ "Datenbank PL/SQL -Sprachreferenz". docs.oracle.com.
Externe Links
- Microsoft SQL Server Drop -Trigger
- Die MySQL -Datenbank triggert
- MySQL DB erstellen Trigger
- DB2 erstellen Trigger -Anweisung erstellen
- Oracle erstellen Trigger
- PostgreSQL erstellen Trigger
- Oracle -Mutationstischprobleme mit Löschen der Kaskade
- SQLite Abfragesprache: Erstellen Sie Trigger
- Oraces Dokumentation zu Triggern