Seite 1 von 1

Temporäres Sperren von Triggern

Verfasst: Fr 16. Apr 2021, 23:56
von zappa2
Gibt es eine Möglichkeit, innerhalb einer SP einen bestimmten Trigger kurzzeitig auf inactive zu setzen?

alter trigger TRIGGER_NAME inactive;

geht natürlich nicht innerhalb einer SP.

Auch wenn ich das als Execute statement ('...'); versuche. Gibt zwar keinen Fehler, aber geht auch nicht.

Ich vermute ja mal, dass es nicht geht, weil das Deaktivieren von Triggern DDL ist, und man die wohl nicht einfach mal soeben innerhalb PSQL machen kann.

Re: Temporäres Sperren von Triggern

Verfasst: Sa 17. Apr 2021, 19:52
von bfuerchau
Bestimmet DDL's kann man nur per dynamischem SQL erledig.
https://firebirdsql.org/refdocs/langref ... cstat.html
Das schöne ist, DDL per Execute unerliegt meist keiner Einschränkung.
Allerdings muss für die Änderung von Table-Metadaten die Tabelle exclusiv im Zugriff sein.

Re: Temporäres Sperren von Triggern

Verfasst: Sa 17. Apr 2021, 21:29
von zappa2
Vielen Dank für die rasche Antwort.

Exklusiver Zugriff auf die Tabelle, dessen Trigger ich temporär umgehen wollte, kann natürlich nicht gewährleistet werden. Demzufolge muss ich einen anderen Weg finden.
Und die Aussage
Although this form of EXECUTE STATEMENT can also be used with all kinds of DDL strings (except CREATE/DROP DATABASE), it is generally very, very unwise to use this trick in order to circumvent the no-DDL rule in PSQL.
ist ja auch ziemlich eindeutig.

Re: Temporäres Sperren von Triggern

Verfasst: So 18. Apr 2021, 12:26
von bfuerchau
Nun ja, in unserer BI-Lösung wird sehr viel zur Laufzeit mit dynamischem DDL gearbeitet.
Dies geht nun mal ausschließlich auf diesem Weg.
Zusätzlich benötige ich da noch eine Sperrlösung, weil 2 DDL's gleichzeitg häufig zum DB-Crash führen.
Aber das erledige ich mit einem "Select * from MyTable for update".
Dieser parkt alle meine DDL-Befehle und sequentialisiert diese.
Mittels autonomous transaction stelle ich auch das Problem der Satzversionen sicher, die auch bei den Systemtabellen zur Anwendung kommt.

Es ist aber nun mal korrekt, dass man Trigger in einer Shared-Umgebung nicht umgehen kann und das ist auch besser so.
Allerdings könntest du Session-Variablen erstellen, die die normalen User/Apps nicht kennen, und deine Trigger prüfen über die Sessionvariable ob sie was tun sollen oder nicht.

Re: Temporäres Sperren von Triggern

Verfasst: Mi 4. Mai 2022, 23:05
von colaflasche
Du könntest mit rdb$get_context einen Kontext abfragen, den du vorher setzt. Wenn er gesetzt ist, springst du per exit aus dem triggern.
Davon muss aber jede connection wissen. Der context ist je connection. Bestehende connections kannst du per Event informieren.

Re: Temporäres Sperren von Triggern

Verfasst: Mi 4. Mai 2022, 23:54
von bfuerchau
Ich denke, die Deaktivierung des Triggers soll nur für die aktve Sitzung bzw. Transaktion gelten. Systemweit wäre ja fatal, da die SP ja nicht generell aufgerufen wird.
Somit ist dein Vorschlag per Context durchaus geeignet, da dies eine Vereinbarung zwischen Trigger und SP ist.