Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Trigger auf Datenbankebene? (https://www.delphipraxis.net/193414-trigger-auf-datenbankebene.html)

MES 27. Jul 2017 11:26

Datenbank: MariaDB • Version: 10.1.13 • Zugriff über: FireDac

Trigger auf Datenbankebene?
 
Hallo, ich habe folgendes Anliegen, das zunächst ganz trivial erscheinen mag.
Vorab: Ich bin kein Datenbankexperte.

Ich möchte das bei gewissen Tabellenoperationen(insert, update...) etwas in diesen Datensatz geschrieben wird.
Typische Funktion für einen (tabellenbezogenen) Trigger.

Nun will ich aber im Nachhinein nicht bei ein paar Hundert Tabellen einen Trigger hinterlegen.
Ich hätte gerne das ich das eine Ebene höher einmalig hinterlege: in der Datenbank an sich.

Wie kann ich also auf der Datenbankebene das Ereignis "User xx hat in der Tabelle yy einen Datensatz hinzugefügt" abfangen um dann wiederum auf diese Tabelle/Datensatz zuzugreifen
und entsprechende Einträge(z.B. Username und Datum) vorzunehmen.

(Mein Ansatz: Die Datenbank überwacht doch soweiso alles was in den Tabellen passiert - über z.B. die Sicherheit. Aber WIE zapf ich das an?)

Danke für eure Hilfe.

himitsu 27. Jul 2017 11:43

AW: Trigger auf Datenbankebene?
 
Ich wüsste jetzt nicht, dass sowas im SQL geht.

Aber du kannst dir über ein SELECT alle Tabellen auflisten lassen und dann für jede Tabelle ein CREATE TRIGGER ausführen und so deine Trigger-Funktion überall dran hängen.

MES 27. Jul 2017 12:07

AW: Trigger auf Datenbankebene?
 
Mein Problem ist das ich in den Datensatz den Benutzername eintragen will. Dieser ist aber der Name mit der er sich in der Anwendung
angemeldet hat und nicht der mit dem in der Datenbank angemeldet ist.

Ich müsste also dem (Tabellen)Trigger einen Parameter übergeben(Username) - und da scheitere ich.

Ich hatte die Idee eine "Übersetzungspabelle" beim Anmelden in die Anwendung zu pflegen.
Da steht dann drin dass der Datenbankuser_xx den Anwendung_Username_yy hat(wird beim ausloggen wieder gelöscht).
Der Trigger sollte nun in dieser Tabelle nachschauen wie der Anwendung_Username lautet und diesen Namen dann in den betroffenen Datesatz posten.

Da die Einträge in jeder Tabelle identisch sind(Name, Datum) brauche ich nur einen Trigger (oder eine SP).

Nersgatt 27. Jul 2017 12:17

AW: Trigger auf Datenbankebene?
 
Zitat:

Zitat von MES (Beitrag 1377593)
Ich hatte die Idee eine "Übersetzungspabelle" beim Anmelden in die Anwendung zu pflegen.
Da steht dann drin dass der Datenbankuser_xx den Anwendung_Username_yy hat(wird beim ausloggen wieder gelöscht).
Der Trigger sollte nun in dieser Tabelle nachschauen wie der Anwendung_Username lautet und diesen Namen dann in den betroffenen Datesatz posten.

So würde ich es machen, allerdings würde ich nicht den Datenbankuser als Schlüssel verwenden, sondern die Connection_id(). Damit funktioniert das dann auch, wenn mehrer Leute sich mich dem selben Datenbankuser anmelden, aber mit verschiedenen Namen in der Anwendung.

Ich glaub aber mit Deiner Trigger-über-alle-Tabellen-Idee sieht es schlecht aus. Das wirst Du einzeln machen müssen.

himitsu 27. Jul 2017 12:22

AW: Trigger auf Datenbankebene?
 
Im CREATE TRIGGER kann man je nach DBMS einen Funktions-Aufruf oder gar ein "beliebiges" SQL-Statement ausführen. (meistens sind die Trigger-Funktionen ohne Parameter und haben nur die impliziten Parameter wie NEW, OLD usw., aber man kann fast immer auch weitere Parameter in die Funktion einbauen und beim Aufruf übergeben)
Das wird aber alles User-unabhängig in der DB registriert und ausgeführt.

Du könntest eine Session-Variable (falls MariaDB sowas kennt) nach dem DB-Connect setzten und Diese in dem Trigger verwenden.

Uwe Raabe 27. Jul 2017 12:45

AW: Trigger auf Datenbankebene?
 
Wäre ein zentrales BeforePost-Event auf Programmebene eventuell eine Alternative? Das wäre zudem noch datenbankunabhängig.

mikhal 27. Jul 2017 12:47

AW: Trigger auf Datenbankebene?
 
Ich würde es im Programm realisieren: In deiner Zugriffskomponente (vermutlich Query) gibt es das Event BeforePost, hier kannst du den Benutzernamen ermitteln und in die gewünschten Tabellenfelder eintragen.

Grüße
Mikhal

Da war einer schneller...

MES 27. Jul 2017 13:15

AW: Trigger auf Datenbankebene?
 
Zitat:

Zitat von himitsu (Beitrag 1377599)
Im CREATE TRIGGER kann man je nach DBMS einen Funktions-Aufruf oder gar ein "beliebiges" SQL-Statement ausführen. (meistens sind die Trigger-Funktionen ohne Parameter und haben nur die impliziten Parameter wie NEW, OLD usw., aber man kann fast immer auch weitere Parameter in die Funktion einbauen und beim Aufruf übergeben)
Das wird aber alles User-unabhängig in der DB registriert und ausgeführt.

In meinem Fall ist es MariaDB.
Was genau meinst du mit "weitere Parameter"? Man kann dem Trigger ohne Umwege ja keine Parameter übergeben.
Oder meinst du damit eine Funktion/Prozedur die innerhalb eines Triggers aufgerufen wird?

mkinzler 27. Jul 2017 13:43

AW: Trigger auf Datenbankebene?
 
Mit MariaDB hast Du da wohl schlechte Karten


Zitat:

Zitat von https://mariadb.com/kb/en/mariadb/trigger-limitations/
Each table can have only one trigger for each timing/event combination (ie: you can't define two BEFORE INSERT triggers for the same table).
..
Triggers cannot operate on any tables in the mysql, information_schema or performance_schema database.


MES 27. Jul 2017 14:38

AW: Trigger auf Datenbankebene?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1377601)
Wäre ein zentrales BeforePost-Event auf Programmebene eventuell eine Alternative? Das wäre zudem noch datenbankunabhängig.

Wie kann ich die realisieren?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz