AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Trigger auf Datenbankebene?
Thema durchsuchen
Ansicht
Themen-Optionen

Trigger auf Datenbankebene?

Ein Thema von MES · begonnen am 27. Jul 2017 · letzter Beitrag vom 30. Jul 2017
Antwort Antwort
Seite 1 von 3  1 23      
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#1

Trigger auf Datenbankebene?

  Alt 27. Jul 2017, 11:26
Datenbank: MariaDB • Version: 10.1.13 • Zugriff über: FireDac
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.
LG

MES
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

AW: Trigger auf Datenbankebene?

  Alt 27. Jul 2017, 11:43
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#3

AW: Trigger auf Datenbankebene?

  Alt 27. Jul 2017, 12:07
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).
LG

MES
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: Trigger auf Datenbankebene?

  Alt 27. Jul 2017, 12:17
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.
Jens
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#5

AW: Trigger auf Datenbankebene?

  Alt 27. Jul 2017, 12:22
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Jul 2017 um 12:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#6

AW: Trigger auf Datenbankebene?

  Alt 27. Jul 2017, 12:45
Wäre ein zentrales BeforePost-Event auf Programmebene eventuell eine Alternative? Das wäre zudem noch datenbankunabhängig.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Trigger auf Datenbankebene?

  Alt 27. Jul 2017, 12:47
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...
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#8

AW: Trigger auf Datenbankebene?

  Alt 27. Jul 2017, 13:15
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?
LG

MES
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Trigger auf Datenbankebene?

  Alt 27. Jul 2017, 13:43
Mit MariaDB hast Du da wohl schlechte Karten


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.
Markus Kinzler
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#10

AW: Trigger auf Datenbankebene?

  Alt 27. Jul 2017, 14:38
Wäre ein zentrales BeforePost-Event auf Programmebene eventuell eine Alternative? Das wäre zudem noch datenbankunabhängig.
Wie kann ich die realisieren?
LG

MES
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:24 Uhr.
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