Als ich ursprünglich etwas über SQL lernte, wurde mir immer gesagt, dass ich Trigger nur dann verwenden soll, wenn Sie wirklich gespeicherte Prozeduren verwenden müssen, wenn dies möglich ist.
Leider war ich damals (vor ein paar Jahren) nicht so neugierig und kümmerte mich um die Grundlagen, wie ich es jetzt bin. Deshalb habe ich nie nach dem Grund gefragt, warum.
Wie ist die Meinung der Community dazu? Ist es nur eine persönliche Präferenz von jemandem oder sollten Trigger vermieden werden (genau wie Cursor), es sei denn, es gibt einen guten Grund für sie.
Antworten:
Der Wikipedia-Artikel zu Datenbank-Triggern bietet einen guten Überblick darüber, was Trigger sind und wann sie in verschiedenen Datenbanken verwendet werden sollen.
Die folgende Diskussion basiert nur auf SQL Server.
Die Verwendung von Triggern ist sinnvoll, wenn ihre Verwendung gerechtfertigt ist. Zum Beispiel haben sie einen guten Wert bei der Prüfung (Aufrechterhaltung des Datenverlaufs), ohne expliziten Prozedurcode für jeden CRUD-Befehl in jeder Tabelle zu benötigen.
Trigger geben Ihnen die Kontrolle, unmittelbar bevor Daten geändert werden und unmittelbar nachdem die Daten geändert wurden. Dies ermöglicht:
Dies kann unter anderem folgende Gründe haben:
Einige Unterschiede zwischen Triggern und gespeicherten Prozeduren ohne Trigger sind (unter anderem):
quelle
Trigger sind eine Voraussetzung für komplexe Datenintegritätsregeln. Diese können nur in der Datenbank erzwungen werden, da sonst Probleme mit der Datenintegrität auftreten.
Sie sind auch der beste Ort für die Überwachung, es sei denn, Sie möchten nicht alle Änderungen an der Datenbank erfassen (dies ist das Problem der Überwachung über die Anwendung).
Trigger können zu Leistungsproblemen führen, wenn sie nicht sorgfältig geschrieben werden und wenn nicht genügend Entwickler über ausreichende Kenntnisse verfügen, um sie gut zu schreiben. Dies ist ein Teil dessen, wo sie ihren schlechten Ruf bekommen.
Trigger sind häufig langsamer als andere Mittel zur Aufrechterhaltung der Datenintegrität. Wenn Sie also eine Prüfbedingung verwenden können, verwenden Sie diese anstelle eines Triggers.
Es ist einfach, schlechte Trigger zu schreiben, die dumme Dinge tun, wie beispielsweise den Versuch, E-Mails zu senden. Möchten Sie wirklich nicht in der Lage sein, Datensätze in der Datenbank zu ändern, wenn der E-Mail-Server ausfällt?
In SQL Server verarbeiten Trigger einen Stapel von Datensätzen. Nur allzu oft denken Entwickler, dass sie nur einen Datensatz einfügen, aktualisieren oder löschen müssen. Dies ist nicht die einzige Art von Datenänderungen, die an einer Datenbank vorgenommen werden. Alle Trigger sollten unter den Bedingungen einer Datensatzänderung und vieler Datensatzänderungen getestet werden. Wenn Sie den zweiten Test nicht durchführen, kann dies zu einer extrem schlechten Leistung der Trigger oder zu einem Verlust der Datenintegrität führen.
quelle
Verwendung von Datenbank-Triggern
quelle
Ein anderer Anwendungsfall, auf den ich persönlich gestoßen bin, betrifft Datenbanken, auf die von mehr als einem Programm zugegriffen wird. Wenn Sie Funktionen implementieren, aber nicht alle Systeme neu entwerfen möchten, ist ein Trigger eine sinnvolle Lösung.
Ich habe zum Beispiel kürzlich an einer Datenbank gearbeitet, die zuvor nur als Office-System existierte. Als eine Webanwendung geschrieben wurde, um mit ihr zu kommunizieren, wollten wir ein Benachrichtigungssystem implementieren (ähnlich wie zum Beispiel stackexchange), das von mehreren Ereignissen wie der Verarbeitung einer Transaktion usw. ausgelöst wird. Wir konnten einen Trigger implementieren, sodass Updates im Office-Backend einen Trigger auslösten, um die Benachrichtigung für das Frontend zu erstellen und dem Benutzer mitzuteilen, dass ihre Transaktion vom Office verarbeitet wurde.
quelle
Trigger können verwendet werden, um Einschränkungen für die Datenbank zu erzwingen, die während der Erstellung des Datenbankschemas und aller DML-Anweisungen nicht erzwungen werden können.
quelle
Nehmen wir an, Sie müssen Daten nahezu in Echtzeit auf ein Drittanbieter-System übertragen. Ihre Tabelle enthält 950 Gigabyte an Daten. Es ist also zu groß, um einfach die gesamte Tabelle auf die App eines Drittanbieters zu übertragen.
Stattdessen sammeln Sie Änderungen in einer Warteschlange. Einige externe Programme senden dann in regelmäßigen Abständen kleine Stapel von Daten aus der Warteschlange.
Das System verfügt über mehr als 2000 gespeicherte Prozeduren. Sie wissen auch, dass im Quellcode Tonnen von SQL vorhanden sind. Um sicherzustellen, dass die Warteschlange korrekt gefüllt ist, müssen Sie alle gespeicherten Prozesse und Codes durchsuchen und hoffen, dass Sie nichts verpassen.
Stattdessen können Sie einen Trigger in die Tabelle einfügen, um die Warteschlange auf dem neuesten Stand zu halten. Verpassen Sie garantiert nichts. Ein zentraler Ort. Leistungsstrafe? Nicht wirklich, weil der Treffer beim Auffüllen der Warteschlange nicht vermieden werden kann, egal ob es sich um einen Trigger oder einen externen handelt.
In diesem Szenario würde ich sagen, dass die Verwendung eines Triggers keine schlechte Wahl für das Design ist. Wenn Sie später eine neue Methode zum Übertragen von Daten verwenden möchten (z. B. dass die Warteschlange nicht funktioniert) und die Benutzeroberfläche sich ändert, sind Sie geschützt, wenn Sie den Auslöser verwenden. Trigger sind oft die beste Wahl. Hören Sie nicht auf dogmatische Anti-Trigger-Fanboys.
quelle
Ein Auslöser, der E-Mails sendet, ist nicht unbedingt eine „blöde“ Idee. Was dumm ist, ist, den E-Mail-Ausfall im Entwurf nicht zu antizipieren und ihn ohne Datenverlust ordnungsgemäß zu handhaben. Der "blöde" Teil davon ist wirklich schlecht für die nicht existierende Fehlerbehandlung durch faule Entwickler, die das Gefühl haben, immun gegen Fehler zu sein.
Ich möchte auch die Beobachtung anbieten, dass ein Trigger einfach gehalten werden kann, indem eine gespeicherte Prozedur / Funktion aufgerufen wird, die willkürlich kompliziert sein kann und durch mehrere Trigger oder andere gespeicherte Prozeduren wiederverwendbar sein kann. Deshalb gibt es Pakete und Bibliotheken.
Bigotterie ist wirklich lähmend.
quelle