SQLite Trigger
SQLite Triggerist eine Callback-Funktion der Datenbank, die automatisch ausgeführt/aufgerufen wird, wenn das angegebene Datenbankereignis eintritt. Im Folgenden finden Sie die wichtigsten Punkte zu SQLite-Triggern:
SQLite-Trigger können so angegeben werden, dass sie bei DELETE, INSERT oder UPDATE einer bestimmten Datenbanktabelle ausgelöst werden, oder bei Aktualisierungen der Spalten einer oder mehrerer bestimmter Tabellen.
SQLite unterstützt nur FOR EACH ROW-Trigger, und es gibt keine FOR EACH STATEMENT-Trigger. Daher ist die explizite Angabe von FOR EACH ROW optional.
Die WHEN-Klausel und Trigger-Aktionen können unter Verwendung der FormNEW.column-nameundOLD.column-nameauf die Zeilenelemente zugreifen, die eingefügt, gelöscht oder aktualisiert werden, wobei column-name der Name einer Spalte aus der dem Trigger zugeordneten Tabelle ist.
Wenn eine WHEN-Klausel angegeben ist, werden die SQL-Anweisungen nur für die angegebenen Zeilen ausgeführt, für die die WHEN-Klausel wahr ist. Wenn keine WHEN-Klausel angegeben ist, werden die SQL-Anweisungen für alle Zeilen ausgeführt.
Die Schlüsselwörter BEFORE oder AFTER bestimmen, wann Trigger-Aktionen ausgeführt werden, und entscheiden, ob sie vor oder nach dem Einfügen, Ändern oder Löschen der zugehörigen Zeile ausgeführt werden.
Wenn die dem Trigger zugeordnete Tabelle gelöscht wird, wird der Trigger automatisch gelöscht.
Die zu ändernde Tabelle muss in derselben Datenbank wie die Tabelle oder Ansicht existieren, an die der Trigger angehängt ist, und darf nurtablename, nichtdatabase.tablename verwenden。
Eine spezielle SQL-Funktion RAISE() kann verwendet werden, um eine Ausnahme innerhalb des Triggerprogramms auszulösen.
Syntax
Erstellen einesTriggersDie grundlegende Syntax lautet wie folgt:
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name ON table_name BEGIN -- 触发器逻辑.... END;
Hier kannevent_nameeine Operation auf der genannten Tabelletable_namebeiINSERT, DELETE und UPDATE seinDatenbankoperation. Sie können optional FOR EACH ROW nach dem Tabellennamen angeben.
Das Folgende ist die Syntax zum Erstellen eines Triggers auf einer oder mehreren angegebenen Spalten einer Tabelle für UPDATE-Operationen:
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name ON table_name BEGIN -- 触发器逻辑.... END;
Beispiele
Nehmen wir an, wir möchten einen Audit-Trail für jeden Datensatz führen, der in eine neu erstellte COMPANY-Tabelle eingefügt wird (falls sie bereits existiert, löschen und neu erstellen):
sqlite> CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
Um den Audit-Trail zu führen, erstellen wir eine neue Tabelle namens AUDIT. Immer wenn ein neuer Datensatz in die COMPANY-Tabelle eingefügt wird, wird eine Protokollnachricht darin eingefügt:
sqlite> CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
Hier ist ID die ID des AUDIT-Datensatzes, EMP_ID ist die ID aus der COMPANY-Tabelle, und DATE enthält den Zeitstempel, wann der Datensatz in COMPANY erstellt wurde. Nun lassen Sie uns einen Trigger für die COMPANY-Tabelle wie folgt erstellen:
sqlite> CREATE TRIGGER audit_log AFTER INSERT
ON COMPANY
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;
Jetzt beginnen wir damit, Datensätze in die COMPANY-Tabelle einzufügen, wodurch ein Audit-Log-Datensatz in der AUDIT-Tabelle erstellt wird. Daher lassen Sie uns einen Datensatz in der COMPANY-Tabelle wie folgt erstellen:
sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );
Dadurch wird der folgende Datensatz in der COMPANY-Tabelle erstellt:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0
Gleichzeitig wird ein Datensatz in der AUDIT-Tabelle erstellt. Dieser Datensatz ist das Ergebnis des Triggers, den wir für die INSERT-Operation auf der COMPANY-Tabelle erstellt haben. Ebenso können Trigger für UPDATE- und DELETE-Operationen nach Bedarf erstellt werden.
EMP_ID ENTRY_DATE ---------- ------------------- 1 2013-04-05 06:26:00
Trigger auflisten (TRIGGERS)
Sie können alle Trigger aus dersqlite_master-Tabelle wie folgt auflisten:
sqlite> SELECT name FROM sqlite_master WHERE type = 'trigger';
Die obige SQLite-Anweisung listet nur einen Eintrag auf, wie folgt:
name ---------- audit_log
Wenn Sie Trigger für eine bestimmte Tabelle auflisten möchten, verwenden Sie die AND-Klausel, um den Tabellennamen zu verketten, wie folgt:
sqlite> SELECT name FROM sqlite_master WHERE type = 'trigger' AND tbl_name = 'COMPANY';
Die obige SQLite-Anweisung listet nur einen Eintrag auf, wie folgt:
name ---------- audit_log
Trigger löschen (TRIGGERS)
Nachfolgend sehen Sie den DROP-Befehl, der zum Löschen vorhandener Trigger verwendet werden kann:
sqlite> DROP TRIGGER trigger_name;Andere Erweiterungen