Hello,
bisher habe ich alle Änderungen im Datenbanksystem über die Applikationsebene gemacht. Nun habe ich einen Fall, bei dem ich gerne einen Trigger einsetzen würde. Dazu habe ich Fragen.
DELIMITER $$
CREATE TRIGGER `kalkulation` AFTER UPDATE ON kalkulationstabelle FOR EACH ROW BEGIN
UPDATE ersatzteile
SET Rabatt = NEW.Rabatt
WHERE TID = NEW.KID;
END $$
DELIMITER ;
Das soll mein Beispieltrigger werden, der in diesem Fall einen veränderten Rabatt der Kalkulation in der Ersatzteile-Tabelle übernimmt.
Meine Fragen:
- Was bedeutet
FOR EACH ROW
?
Muss nun SQL (in meinem Fall mysql) die komplette Kalkulationstabelle nach geänderten Rabatten durchsuchen? Dann könnte so ein Trigger ja mitunter sehr leistungshungrig sein, oder?
Jede betroffene (affected) Row wird mit dem Trigger behandelt.
- Wie sinnvoll ist der Einsatz eines Triggers auf Applikationsebene?
Was ich meine: Ein Trigger ist nicht dramatisch, aber wenn ich sehr viele Trigger nutzen würde, könnte das ganz schön aufwendig sein, wenn mal Fehler auftreten.
Die Trigger arbeiten auf Datenbankebene. Die API bekommt also nichts davon mit, wenn Du im Trigger keine Exception produzierst.
- Wie sicher sind Trigger? Funktionieren die immer oder gibt es Fehlerquellen, die ich als Trigger-Anfänger nicht kenne?
Ja, die Zugriffsrechte müssen entsprechend gesetzt sein.
Trigger können Exceptions hervorrufen. Die kann man auch künstlich erzeugen lassen, wenn im Trigger festgelegte Bedingungen nicht stimmen. Deshalb sollte man, wenn man Trigger benutzt, keine Sammel-Updates mehr fahren. Sonst geht die Kontrollmöglichkeit eventuell verloren, je nach Programmiermodel.
- Kann man auch Trigger-Schlangen bilden?
Tabelle1 wird upgedated, daraufhin wird Tabelle2 upgedated, daraufhin Tabelle3? (mal vom Sinngehalt ganz abgesehen)
Man kann storded Procedures/Routines erstellen, der sich die definierten Trigger bedienen. Aber dabei immer auf den Kontrollfluss achten und die Datenintegrität. Ggf. muss man eine Transaktion starten.
Es gibt übrigens nur ein einziges Set von Insert-, Update-, Delete- Triggern pro Tabelle. Darin muss man die Einzelentscheidungen für unterschiedliche Spalten dann per CASE o. ä. verpacken.
Einen SELECT-Trigger gibt es übrigens nicht. Den kann man sich aber basteln, wenn man den Direktzugriff auf die Tabellen sperrt und dafür stored Routines vereinbart. Dann kann man z.B. auch direkt in der Datenbank festhalten, wer welchen Datensatz wann angefordert hat. Die API muss davon nichts wissen.
- Wenn ich einen Trigger zusätzlich zur selben Programmierung auf Applikationsebene einsetze, schadet das (oder könnte schaden) oder ist das einfach nur redundant?
Das ist dann kein Trigger im klassischen Sinne, also nicht ereignisgeteuert, sondern "nur" ein Statement(-Block) in der Vorgangsverwaltung/-Steuerung des Client-Server-Modells.
Bedenke dabei, dass jeder andere Prozess, der dieses Modul nicht benutzen muss, daran vorbei arbeiten kann. Diese Umgehungsmöglichkeit der Geschäftsregeln schließt man dadurch aus, indem man alle Regeln in der Datenbank kapselt und nur einen Zugang zulässt.
Man kann/sollte also Trigger weitestgehend vermeiden, indem man den direkten Zugriff auf die Tabellen sperrt und alle Reqests über Stored Procedures/Routines regelt, Dazu muss man sich ein wenig mit dem Rechtesystem des DBMS beschäftigen, aber es lohnt sich.
Glück Auf
Tom vom Berg
--
Es gibt soviel Sonne, nutzen wir sie.
www.Solar-Harz.de
S☼nnige Grüße aus dem Oberharz