Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#25

AW: Trigger auf Datenbankebene?

  Alt 29. Jul 2017, 10:19
Ausgehend von https://mariadb.com/kb/en/sql-99/act...n-of-triggers/ kann man bei MariaDB mehrere Trigger für eine Tabelle erstellen, die nacheinander abgearbeitet werden.

Gegeben sei:
SQL-Code:
CREATE TRIGGER Trigger_1 AFTER UPDATE ON Table_1 ...;

CREATE TRIGGER Trigger_2 BEFORE UPDATE ON Table_1 ...;

CREATE TRIGGER Trigger_3 AFTER UPDATE ON Table_1 ...;
Zuerst wird Trigger_2 ausgeführt, dann Trigger_1 und anschließend Trigger_3.

Wenn ich das halbwegs richtig sehe, müsste man hier also automatisch für alle Tabellen einen zusätzlichen Trigger generieren können, der, da zuletzt erstellt, auch zuletzt ausgeführt wird. Im Trigger kann man dann eine Funktion aufrufen, die den Usernamen, auf einem der hier bereits beschriebenen Wege, ermittelt und in die Datenbank schreibt.

Ungefähr sowas sollte sinngemäß gehen:
SQL-Code:
CREATE TRIGGER Tabellenname_Insert
BEFORE INSERT ON Tabellenname
  REFERENCING NEW ROW AS New
FOR EACH ROW
BEGIN ATOMIC
  SET New.UserName = FuntionZurBenutzernemenermittlung;
  SET New.Datum = Current_Date;
END
Was ich nicht habe finden können ist, ob ein Trigger auch für mehrere Ereignisse aufgerufen werden kann, also ein

BEFORE INSERT OR UPDATE ON Tabellenname

Es scheint aber eher nicht der Fall zu sein, so dass halt je Tabelle zwei Trigger benötigt werden:
SQL-Code:
CREATE TRIGGER Tabellenname_Insert BEFORE INSERT ON Tabellenname

CREATE TRIGGER Tabellenname_UPDATE BEFORE UPDATE ON Tabellenname
Inhaltlich können sie identisch sein.

Die oben verlinkte Dokumentation zu MariaDB ist sehr ausführlich und sollte für alle MariaDB-Nutzer zur Pflichtlektüre gehören und als ersten Anlaufstelle bei Fragen dienen.

Der Triggerquelltext läßt sich vermutlich sogar per SQL über INFORMATION_SCHEMA.TABLES generieren, sowas in der Art:
SQL-Code:
select
  ConCat('CREATE TRIGGER TRI_',Table_Name,
  ' BEFORE INSERT ON ',Table_Name,
  ' REFERENCING NEW ROW AS New FOR EACH ROW',
  ' BEGIN ATOMIC',
  ' SET New.UserName = FuntionZurBenutzernemenermittlung;'
  ' SET New.Datum = Current_Date;',
  ' END') as SQL_Statement
from INFORMATION_SCHEMA.TABLES
where TABLE_SCHEMA = 'DasBenutzerSchema
and Table_Name like 'ErforderlicheEinschränkungFürBenötigteTeilmenge%';
Das Ergebnis müsste man dann irgendwie per Batch oder so abarbeiten.

Eventuell ginge es auch innerhalb einer Prozedur über Execute Immediate (https://mariadb.com/kb/en/mariadb/execute-immediate/), aber da hab' ich jetzt keine Lust, das herauszufinden.

Geändert von nahpets (29. Jul 2017 um 10:21 Uhr) Grund: Ewig diese Schreibfehler ;-)
  Mit Zitat antworten Zitat