2016-07-22 27 views
0

Die folgenden Beobachtungen ist auf einer großen sqlite3-Datenbank.Auslöser mit keinem Namen auf sqlite_trace Callback-Funktion

Setup: Ich habe eine Sicht, die einen Trigger für Udpate eines Feldes hat. Dieser Auslöser dieser Ansicht enthält mehrere Aktualisierungsanweisungen für verschiedene zugrunde liegende Tabellen. Diese Tabellen haben auch Trigger für die Aktualisierung der entsprechenden Felder.

Es gibt auch einen registrierten Rückruf mit sqlite_trace-Methode auf unseren Produktionscode. Diese Methode druckt nur die Aktivität in dieser gegebenen Datenbank. Beobachtungen

:

  1. Wenn diese Ansicht für dieses Feld ein aktualisiert wird, aktualisiert er das Feld der zugrundeliegenden Tabellen.
  2. Aktualisierung des Feldes auf zugrunde liegenden Tabellen lösen ihre jeweiligen Trigger aus.
  3. Die registrierte Callback-Methode wird aufgerufen, die ausgibt, dass TRIGGER in der Datenbank mit dem Triggernamen aufgerufen wird.

Allerdings gibt es einige Trigger ohne Namen. Oder die Callback-Methode druckt nur TRIGGER ohne Namen. Zum Beispiel:

- Update-Ansicht V1

- TRIGGER T1

- TRIGGER T2

- TRIGGER

- TRIGGER T3

- TRIGGER

- TRIGGER T4

Meine Frage ist: Was sind diese un-named Auslöser? Wann werden sie genannt? Ist dies, weil einige Felder UPDATE RESTRICT/DELETE RESTRICT/CASCADE auf den Tabellen haben? Ich konnte keine Informationen von diesen Auslösern erhalten. Ich versuche nur, das Geheimnis dieser unbenannten Auslöser zu lösen.

+0

Niemand hier weiß, welche Trigger Sie definiert haben. –

Antwort

1

Die nicht benannten Trigger sind wegen der referenziellen Integrität (Fremdschlüssel) Beziehung einer Tabelle mit einer anderen Tabelle.

Schritte zum Reproduzieren:

Schritt 1: Erstellen Sie zwei Tabellen, in denen ein Tabellenverweis andere Tabelle und einige Testreihen in diesen Tabellen erstellen. T1 kann CASCADE ODER RESTRICT zum Löschen oder Aktualisieren haben.

CREATE TABLE T (id NUMBER); 
CREATE TABLE T1 (id NUMBER REFERENCES T (id) DELETE (CASCADE/RESTRICT) UPDATE (CASCADE /RESTRICT)); 

Schritt 2: Schreiben Sie einen Test C++ Programm, das eine sqlite3 Verbindung schafft. Weitere Informationen zur SQLite C/C++ - Schnittstelle finden Sie unter https://www.sqlite.org/cintro.html.

Schritt 3: aktivieren sqlite3_exec

PRAGMA FOREIGN_KEY=ON . 

Schritt mit folgenden 4: einen Rückruf mit sqlite3_trace registrieren, die die Abfrage in der Callback-druckt. Siehe: https://www.sqlite.org/c3ref/profile.html

Schritt 5: Call-Methode ausführt ID von Tabelle T aktualisieren

Ausgang: Above Anweisung UPDATE von Tabelle T und auf referenzierten Tabellen von T. In diesem Fall ausführen, seine T1. Das Update in Tabelle T1 generiert einen nicht benannten Trigger und auf sqlite3_trace wird ein Callback generiert. Die SQL-in Rückruf hat keine Informationen über diese Trigger und somit ausgegeben wird, wie unten, das heißt Trigger ohne Namen:

TRIGGER - 

Fazit: Der un-named Trigger wegen der Fremdschlüsselbeziehung zu sehen ist. Wenn eine referenzierte Tabelle geändert wird, wird versucht, die zugehörigen Tabellen zu ändern, was zu nicht benannten Triggern in sqlite3_trace Callbacks führt.

Hinweis: Es wird einen nicht benannten Auslöser für jede Referenz geben. Wenn also ein Feld in n Tabellen referenziert wird, sehen Sie auf sqlite3_trace n nicht benannte Trigger und n Callbacks. Außerdem sollte die Datenbank PRAGMA FOREIGN_KEY auf setzen, damit die referenzielle Integrität erzwungen wird. Sie werden dieses Verhalten nicht sehen, wenn PRAGMA FOREIGN_KEY OFF (0) ist.