Ich weiß, dass Trigger verwendet werden können, um gespeicherte Daten zu validieren und die Datenbank konsistent zu halten. Führen Sie jedoch eine Validierung der Daten auf der Anwendungsseite durch, bevor Sie sie in der Datenbank speichern.
Zum Beispiel speichern wir Clients und möchten eine Validierung durchführen, die auf DDL-Ebene nicht einfach durchzuführen ist. https://severalnines.com/blog/postgresql-triggers-and-stored-function-basics
Ein weiteres Beispiel ist die Prüfung.
Aktualisieren
Wie Trigger und Datenbanktransaktionen zusammenarbeiten. Zum Beispiel, wenn ich eine Validierung der eingefügten Daten durchführen möchte. Dies erfolgt innerhalb einer Transaktion. Was passiert früher: Transaktion wird festgeschrieben oder Trigger ausgeführt?
database
database-design
postgres
Yan Khonski
quelle
quelle
However, why not perform validation of data on the application side before storing them into the database?
Nun, diese beiden schließen sich nicht gegenseitig aus. Es ist wahrscheinlich, dass Sie auf beiden Seiten unterschiedliche Dinge validieren. Während die Validierungen auf der Anwendungsseite geschäftsorientiert sind, sind die Validierungen auf der Datenbank datenzentrierter. Denken Sie in einer Datenbank, die von mehreren und unterschiedlichen Anwendungen gespeist wird.Antworten:
Dies hängt davon ab, welche Art von Anwendungssystem Sie erstellen:
Wenn Sie ein anwendungsorientiertes System erstellen, das nur eine Hauptanwendung enthält, mit einer dedizierten Datenbank speziell für diese Anwendung und idealerweise einem Team, das für die gleichzeitige Weiterentwicklung von Anwendung und Datenbank verantwortlich ist, können Sie die gesamte Validierungslogik und auch die Prüfung beibehalten Logik innerhalb der Anwendung.
Der Hauptvorteil davon ist, dass Sie die Geschäftslogik nicht zwischen Anwendung und Datenbank verteilen müssen, sodass die Wartung und Weiterentwicklung des Systems häufig einfacher wird. Als Bonus binden Sie die Anwendung nicht zu stark an einen bestimmten DBMS- oder DBMS-Anbietertyp. Dieser Ansatz ist offensichtlich erforderlich, wenn Ihre Anwendung ein leichtes DB-System verwenden möchte, das keine Trigger bereitstellt.
Wenn Sie jedoch ein System erstellen, in dem viele verschiedene Anwendungen eine gemeinsame Datenbank gemeinsam nutzen und nicht vorhersehen können, welche Anwendungen in Zukunft darauf schreiben oder welche Teams in Zukunft Anwendungen zum Füllen von Daten in die Datenbank entwickeln, dann ist dies der Fall Es ist besser, wenn Ihre Datenbank dafür verantwortlich ist, so viel Datenkonsistenz wie möglich zu gewährleisten. Und hier werden Trigger wirklich hilfreich. In größeren Systemen reichen referenzielle Einschränkungen häufig nicht aus, aber ein Trigger, der eine gespeicherte Prozedur aufruft, kann nahezu jede Art von Validierung implementieren, die Sie benötigen.
Ein weiterer Grund für die Verwendung von Triggern kann die Leistung sein: In komplexen Datenmodellen treten nicht selten komplexe Konsistenzregeln auf, die die Verwendung vieler zusätzlicher Daten erfordern, die nicht Teil des aktuellen Arbeitssatzes sind, der in der Clientanwendung verfügbar ist. Das erstmalige Übertragen all dieser Daten über das Netzwerk, um eine Validierung auf der Clientseite zu ermöglichen, kann erhebliche Auswirkungen auf die Leistung haben.
Siehe auch diesen älteren SE-Beitrag: Anwendungslogik gegen DB-Trigger für die Datenbankbereinigung
Entscheiden Sie also selbst, welche Art von System Sie erstellen, und treffen Sie eine fundierte Entscheidung, ob Trigger das richtige Werkzeug für Ihren Fall sind oder nicht.
quelle
Ich denke, die Frage betrifft die Verantwortung für die Qualität der Daten.
Die Antwort hängt davon ab, wie Sie das System sehen.
Wenn Sie die Datenbank als einen unabhängigen, eigenständigen und autonomen Dienst betrachten, der von der Anwendung getrennt ist, ist die Datenbank dafür verantwortlich, die Konsistenz und Qualität der darin enthaltenen Daten sicherzustellen. Im Wesentlichen, weil diese Datenbank von einer anderen Anwendung verwendet werden kann, sodass sie sich nicht darauf verlassen kann, dass diese zweite Anwendung das gleiche Konsistenz- und Qualitätsverhalten aufweist. Unter diesen Umständen muss die Datenbank so konzipiert sein, dass eine API und ein autonomes Verhalten verfügbar gemacht werden. In dieser Ansicht gibt es mindestens zwei Anwendungen, eine davon ist die Datenbank und die andere ist die Anwendung, die sie verwendet.
Umgekehrt könnte die Datenbank als eine komplizierte Form von Datei betrachtet werden, die unter der direkten und vollständigen Kontrolle der Anwendung steht. In diesem Sinne entwickelt sich die Datenbank zu einem reinen Serialisierungs- und Dokumentennavigationswerkzeug. Es bietet möglicherweise einige erweiterte Verhaltensweisen zur Unterstützung der Abfrage- und Dokumentwartung (wie dies bei JSON- oder XML-Tools der Fall ist), muss dies jedoch nicht (wie bei den meisten Dateistreams). In diesem Fall liegt es ausschließlich in der Verantwortung des Programms, das richtige Format und den richtigen Inhalt in der Datei beizubehalten. In dieser Ansicht gibt es eine Anwendung.
In beiden Ansichten lautet die nächste Frage, wie die Verwendung der Datenbank als ausgefallene Datei oder als separater Dienst unterstützt werden kann. Sie könnten dies erreichen durch:
Jedes hat seine eigenen Vor- und Nachteile und hängt von den architektonischen Einschränkungen der Umgebung ab, in der das System arbeitet.
Unabhängig davon, welche Ansicht Sie vertreten, lohnt es sich immer, Daten an Grenzen zu validieren.
Wie viel Validierung an jeder Grenze erforderlich ist, hängt davon ab, wie riskant es ist, sie nicht zu validieren.
quelle
Nein, Sie sollten niemals Trigger verwenden, um die Validierung durchzuführen.
Die Datenbank ist nur für ihre eigene Integrität verantwortlich. Jede Benutzerüberprüfung sollte von Ihrer Anwendung durchgeführt werden.
Datenbanken führen drei Validierungsstufen für die Integrität durch. Die erste ist die Validierung auf Feldebene. Ein Feld kann erforderlich sein. Wenn kein Wert (null) vorhanden ist, handelt es sich um einen Fehler. Dies kann auch eine Prüfbedingung sein. Eine Domain hat eine aufgezählte Anzahl von Werten.
Zweitens gibt es Beziehungen zwischen Tabellen. In einer Tabelle speichern Sie einen oder mehrere Fremdschlüssel, verknüpfen diese Tabelle mit anderen Tabellen und verlangen, dass die Werte gültige Schlüssel für die "andere Tabelle" sind. Stellen Sie sich eine Adressdatenbank vor, in der wir Adressen verschiedener Länder unterstützen. Ein Länderschlüssel in einer Adresse muss auf ein bekanntes Land verweisen. Ob die Daten (z. B. eine Postleitzahl) gültig sind, spielt bei dieser Integritätsprüfung keine Rolle.
Drittens und am kompliziertesten sind Auslöser. In der Regel sollten diese (Wortspiel nicht beabsichtigt) Integritätsregeln betreffen, die an Bedingungen geknüpft sind. Um auf das Adressbeispiel zurückzukommen: Wenn ein Land keine Postleitzahl hat, wäre es ein Problem, wenn ein Land in dieser Liste eine Postleitzahl hätte. Die Prüfung wäre also: Wenn dieses Land keine Postleitzahlen hat, sollte das Postleitzahlenfeld null sein.
Die Validierung ist das Anliegen der Anwendung. Die Tatsache, dass eine deutsche Postleitzahl nur aus Ziffern besteht, ist eine Überprüfung, die der Antrag vornehmen sollte, nicht die Datenbank. Die Zeile ist dünn, daher müssen Sie in einigen Fällen möglicherweise überlegen / diskutieren, ob sich etwas in einem Auslöser (Schutz der Integrität Ihrer Datenbank) oder in der Anwendung (Validierung durch den Benutzer) befinden sollte.
quelle
Audit ist ein klassisches Beispiel für den effektiven Einsatz von Triggern. Ich habe einige Fehler gefunden, die der Tester (Verschieben eines Clients von einer Serviceebene auf eine andere) dank einer Audittabelle gemacht hat, die durch Trigger implementiert wurde. Ich empfehle dringend, Trigger für die Prüfung zu verwenden.
Die Validierung könnte im Front-End-Bereich erfolgen, aber ich habe seltsame Fehler in der Datenbank gesehen, die ich behandelt habe (Personen, die im Jahr 3000 geboren wurden usw.), und da einige von ihnen selbst erstellt wurden, empfehle ich dringend, eine zusätzliche Ebene zu verwenden der Validierung in der Datenbank, nur für den Fall. Natürlich können diese Fehlertypen mit Überprüfungsbeschränkungen vermieden werden und sind oftmals effektiver (in MS SQL sind sie die bevorzugte Methode; überprüfen Sie immer die Dokumentation).
quelle
Da es um die Frage geht, ob wir wirklich Trigger für relationale Datenbanken benötigen, gibt es hier einige andere Anwendungsfälle, in denen Trigger verwendet werden können:
instead of
. Mit diesem Mittel kann man Einträge aus einer Ansicht einfügen, aktualisieren und löschen. Die Trigger können diese Aktionen auf mehrere Tabellen verteilen. Auf diese Weise können Sie eine eingeschränkte Ansicht verfügbar machen, ohne die Details der zugrunde liegenden Tabellen offenzulegen.Als Nachteil ist die Geschäftslogik auf die Schichten verteilt und dies ist ein Hauptnachteil für die Wartung. Wie ein anderer Autor schrieb, ist es eine dünne Grenze zwischen Anwendung und Datenbank und die Wahl ist nicht immer klar. Meine persönliche Meinung ist, dass Trigger die Entwickler belasten. Sie können Zeit in der Entwicklung sparen. Auf jeden Fall verbessern sie die Benutzererfahrung, da sie die Leistung über langsame Netzwerkverbindungen steigern.
quelle