Frage

In der Vergangenheit habe ich nie ein fan der Verwendung von Triggern auf Datenbank-Tabellen.Für mich ist Sie immer dargestellt wird "Magie", die im Begriff war zu geschehen, die auf der Datenbank Seite, weit, weit Weg von der Kontrolle von my application code.Ich wollte auch begrenzen Sie die Menge der Arbeit, die die DB zu tun hatte, als es in der Regel eine gemeinsame Ressource ist, und ich immer davon ausgegangen, löst bekommen könnte zu teuer sein, im high-load-Szenarien.

Das heißt, ich habe gefunden ein paar Fälle, in denen auslöst, sinnvoll zu nutzen (zumindest meiner Meinung nach machten Sie Sinn).Vor kurzem jedoch, ich fand mich in einer situation, wo ich manchmal vielleicht müssen Sie "bypass" der Auslöser.Ich fühlte mich wirklich schuldig darüber, dass Sie nach Möglichkeiten suchen, dies zu tun, und ich denke immer noch, dass eine bessere Datenbank-design-lindern würde die Notwendigkeit, für diese zu umgehen.Leider ist dieser DB wird von mulitple Anwendungen, von denen einige sind verwaltet durch eine sehr unkooperativ Entwicklung team, die würde Schreien über-schema ändert, so dass ich nicht weiterkam.

Was ist die Allgemeine consesus draußen zu Triggern?Liebe em?Hate em?Denken Sie dienen einem Zweck in einigen Szenarien?Tun Sie denken, dass mit die Notwendigkeit zu umgehen, eine trigger bedeutet, dass Sie "etwas falsch"?

War es hilfreich?

Lösung

Auslöser sind in der Regel falsch verwendet, bugs einzuführen und sollten daher vermieden werden.Nie design einen trigger zu tun integrity constraint checking, dass die Kreuze Zeilen in einer Tabelle (e.g "das Durchschnittliche Gehalt von der Abteilung nicht überschreiten, X).

Tom Kyte, VP Oracle hat angegeben, dass er lieber zu entfernen von Triggern als eine Funktion von Oracle Datenbank wegen Ihrer häufigen Rolle in bugs.Er weiß es ist nur ein Traum, und die Trigger sind hier, um zu bleiben, aber wenn er könnte, er würde zu entfernen Auslöser von Oracle, wäre er (zusammen mit dem, WENN ANDERE Klausel und autonome Transaktionen).

Können Trigger verwendet werden, richtig?Absolut.

Das problem ist - sind Sie nicht ordnungsgemäß verwendet, so viele Fälle, die ich bereit wäre zu geben jede wahrgenommene nutzen, nur um entfernen der Missbrauch (und bugs), verursacht durch Sie.- Tom Kyte

Andere Tipps

Denken Sie an eine Datenbank wie eine große, hohe Objekt - nach jedem Anruf auf es, es sollten in einem logisch konsistenten Zustand.

Datenbanken setzen sich über Tabellen und behalten die Tabellen und Zeilen konsequent getan werden kann, mit Trigger.Ein weiterer Weg, um diese konsistent ist, dass er direkten Zugriff auf die Tabellen und nur so dass es durch gespeicherte Prozeduren und Ansichten.

Der Nachteil von Trigger ist, dass jede Aktion aufrufen können Ihnen;dies ist auch eine Stärke - nicht zu Schraube bis die Integrität des Systems durch Inkompetenz.

Als Kontrapunkt, wenn der Zugriff auf eine Datenbank, die nur über gespeicherte Prozeduren und Ansichten können sich noch immer backdoor-Zugriff-Berechtigungen.- Benutzer mit ausreichenden Berechtigungen vertraut sind, nicht zu brechen Integrität der Datenbank, alle andere gespeicherte Prozeduren verwenden.

Wie zu reduzieren die Menge der Arbeit:Datenbanken sind erstaunlich effizient, wenn Sie nicht müssen deal mit die außerhalb Welt;Sie wären wirklich überrascht, wie viel auch zum Wechsel beeinträchtigt die Leistung.Das ist ein weiterer Pluspunkt von gespeicherten Prozeduren:anstatt ein Dutzend Anrufe in die Datenbank (und alle damit verbundenen Rundreisen) gibt es einen.

Bündeln-Sachen in einer einzigen gespeicherten Prozedur ist in Ordnung, aber was passiert, wenn etwas schief geht?Angenommen, Sie haben 5 Schritte und der erste Schritt fehlschlägt, was passiert, um die weiteren Schritte?Sie müssen hinzufügen eine ganze Reihe von Logik, in der es gerecht, dass situation.Sobald Sie anfangen zu tun, verlieren Sie die Vorteile der gespeicherten Prozedur in diesem Szenario.

Business-Logik muss irgendwo hingehen, und es gibt eine Menge von stillschweigenden domain-Regeln eingebettet in das design der Datenbank - Beziehungen, Zwänge und so weiter sind ein Versuch, die zum codieren von business-Regeln sagen, zum Beispiel, kann ein Benutzer nur ein Passwort.Gegeben, Sie habe angefangen, schob business-Regeln auf den Datenbank-server, indem er diese Beziehungen und so weiter, wo zeichnest du die Linie?Wann ist die Datenbank geben bis die Verantwortung für die Integrität der Daten, und starten Sie das Vertrauen, dass das aufrufen von apps und der Datenbank-Benutzer, es richtig zu machen?Gespeicherte Prozeduren mit diesen Regeln eingebettet in Sie schieben kann viel politische macht in die Hände des DBAs.Es kommt darauf an, wie viele Ebenen gehen, gibt es in der n-tier-Architektur;wenn es eine Präsentation, business-und Daten-layer, wo kommt die Trennung zwischen business-und Daten liegen?Welchen Mehrwert hat die business-Schicht hinzufügen?Sie führen die business-Schicht auf dem Datenbank-server als gespeicherte Prozeduren?

Ja, ich denke, dass eine bypass-trigger bedeutet, dass Sie "etwas falsch";in diesem Fall ein trigger ist nicht für Sie.

enter image description here

Ich arbeite mit web-und winforms-Anwendungen in c# und ich HASSEN Trigger mit einer Leidenschaft.Ich habe nie kommen über eine situation, wo ich rechtfertigen könnte mit ein Auslöser über die Umstellung, die Logik in der business-Schicht die Anwendung und stellen Sie die trigger-Logik.

Ich mache das nicht DTS-Typ arbeiten oder etwas wie, dass, so könnte es einige Anwendungsfälle für die Verwendung von trigger gibt, aber wenn jemand in jedem meiner teams sagt, dass Sie vielleicht wollen, verwenden Sie einen trigger, Sie besser bereit, Ihre Argumente gut, weil ich mich weigere zu stehen und lassen Trigger Hinzugefügt werden, um jede Datenbank, die ich arbeite.

Einige Gründe, warum ich nicht wie Trigger:

  • Sie bewegen Logik in der Datenbank.Sobald Sie anfangen zu tun, dass Sie Fragen für eine Welt der Schmerzen, denn Sie verlieren Ihre debugging, Ihr Kompilierung Sicherheit, Ihre Logik flow.Es ist alles bergab.
  • Die Logik, die Sie implementieren ist nicht einfach für alle sichtbar.
  • Nicht alle Datenbank-engines unterstützen, so löst Ihre Lösung schafft Abhängigkeiten auf Datenbank-engines

Ich bin sicher, ich könnte noch mehr Gründe, die aus der Spitze von meinem Kopf, aber diese allein sind genug für mich, nicht zu verwenden die Trigger.

"Nie design einen trigger zu tun integrity constraint checking, dass die Kreuze Zeilen in eine Tabelle" -- ich kann nicht Zustimmen.Die Frage ist, tagged 'SQL Server' und CHECK-Einschränkungen " - Klauseln, die in SQL Server nicht enthalten eine Unterabfrage;schlimmer noch, die Umsetzung scheint einen 'hard coded' Annahme, dass eine Prüfung beinhaltet nur eine einzige Zeile, so dass die Verwendung einer Funktion nicht zuverlässig.Also wenn ich eine Einschränkung, die nicht legitim sind mit mehr als einer Zeile-und ein gutes Beispiel ist hier das sequenced primary key in einer klassischen "gültige Zeit" zeitliche Tisch, wo ich müssen, um zu verhindern, dass überlappende Perioden für die gleiche Einheit -- wie kann ich das tun, ohne dass ein trigger?Denken Sie daran, dies ist ein Primärschlüssel, etwas zu gewährleisten, habe ich die Integrität der Daten, also die Durchsetzung der es irgendwo anders als die DBMS ist aus der Frage.Bis zum CHECK-constraints bekommen Unterabfragen, ich sehe keine alternative zur " Verwendung von Auslösern für bestimmte Arten von Integritätsbedingungen.

Auslöser können sehr hilfreich sein.Sie können auch sehr gefährlich sein.Ich denke, Sie sind gut für Haus Reinigung Aufgaben wie das Auffüllen von audit-Daten (erstellt durch änderungsdatum, etc.) und in einigen Datenbanken können verwendet werden für die referenzielle Integrität.

Aber ich bin kein großer fan von setzen viele business-Logik in Ihnen.Dies kann die Unterstützung problematisch, weil:

  • es ist eine zusätzliche Schicht von code, um Forschung
  • manchmal, wie die OP gelernt, wenn Sie tun müssen ein Daten-Update der Auslöser sein könnte, Dinge zu tun, mit der Annahme, dass die änderung der Daten immer über eine Anwendung der Richtlinie und nicht von einem Entwickler oder DBA ein problem zu beheben, oder sogar aus einer anderen app

Als für das zu umgehen einen Auslöser, etwas zu tun, es könnte bedeuten, dass Sie etwas falsch machen, oder es könnte bedeuten, dass der Auslöser ist, macht etwas falsch.

Die Allgemeine Regel, die ich wie zu verwenden die Trigger ist davon zu halten ist leicht, schnell, einfach und nicht-invasiv wie möglich.

Ich finde mich Triggern umgehen, wenn dabei die bulk-Daten werden importiert.Ich denke, es ist gerechtfertigt, in solchen Fällen.

Wenn Sie am Ende unter Umgehung der Trigger sehr oft obwohl, Sie wahrscheinlich benötigen, um einen anderen Blick auf das, was Sie setzen Sie Sie in den ersten Platz.

Im Allgemeinen würde ich vote für "Sie dienen einem Zweck in einigen Szenarien".Ich bin immer wieder nervös über die Auswirkungen auf die Leistung.

Ich bin kein fan, persönlich.Ich werde Sie benutzen, aber nur, wenn ich entdecken Sie einen Engpass im code, die können gelöscht werden durch Aktionen bewegen sich in einem auslösen.Im Allgemeinen, ich bevorzuge Einfachheit und ein Weg, die Dinge einfach zu halten, ist die Logik an einem Ort - die Anwendung.Ich habe auch gearbeitet, auf Arbeitsplätze, wo der Zugriff ist sehr voneinander.In diesen Umgebungen, die mehr code, den ich pack in Trigger, die mehr Menschen ich haben zu engagieren, selbst für die einfachsten behebt.

Ich zum ersten mal löst ein paar Wochen.Wir umgestellt, eine Produktion von SQL server 2000 auf SQL 2005 und wir haben festgestellt, dass die Fahrer waren anders zu Verhalten mit NText Felder (speichern einer großen XML-Dokument), das absetzen der letzten byte.Ich verwendet einen trigger als eine temporäre Lösung, um einen zusätzlichen dummy-byte (ein Raum), um das Ende der Daten, der Lösung unseres Problems, bis eine richtige Lösung konnte gerollt werden.

Andere als diese spezielle, temporäre Fall, würde ich sagen, dass ich diese vermeiden, da Sie nicht ausblenden, was Los ist, und die Funktion, die Sie bereitstellen, behandelt werden sollten, ausdrücklich von der Entwickler nicht dann, als einige versteckte Magie.

Ehrlich gesagt, das einzige mal, dass ich Trigger verwenden, um zu simulieren, einen eindeutigen index, darf einen NULL-Wert, die zählen nicht für die Einzigartigkeit.

Wie zu reduzieren die Menge der Arbeit:Datenbanken sind erstaunlich effizient, wenn Sie nicht müssen deal mit die außerhalb Welt;Sie wären wirklich überrascht, wie viel auch zum Wechsel beeinträchtigt die Leistung.Das ist ein weiterer Pluspunkt von gespeicherten Prozeduren:anstatt ein Dutzend Anrufe in die Datenbank (und alle damit verbundenen Rundreisen) gibt es einen.

das ist ein wenig off-topic, aber Sie sollten sich auch bewusst sein, dass Sie nur bei dieser Suche von einem möglichen positiven.

Bündeln-Sachen in einer einzigen gespeicherten Prozedur ist in Ordnung, aber was passiert, wenn etwas schief geht?Angenommen, Sie haben 5 Schritte und der erste Schritt fehlschlägt, was passiert, um die weiteren Schritte?Sie müssen hinzufügen eine ganze Reihe von Logik, in der es gerecht, dass situation.Sobald Sie anfangen zu tun, verlieren Sie die Vorteile der gespeicherten Prozedur in diesem Szenario.

Gesamt-fan,

aber wirklich haben zu verwenden Sie es sparsam, wenn,

  • Notwendigkeit der Erhaltung von Konsistenz (vor allem, wenn Maßtabellen sind in einem Lager, und wir müssen beziehen sich auf die Daten in der Faktentabelle mit Ihrem richtigen dimension .Irgendwann, die richtige Zeile in der Tabelle der dimension sehr teuer sein können, um zu berechnen, so dass Sie wollen, dass der Schlüssel geschrieben werden direkt auf die Faktentabelle, ein guter Weg, zu behaupten, dass "Beziehung" ist mit trigger.

  • Anmelden müssen änderungen (in einer audit-Tabelle für Beispiel, es ist nützlich zu wissen, was @@Benutzer kam der Wechsel und, wenn es aufgetreten ist).

Einige RDBMS wie sql server 2005 auch bieten Sie mit die Trigger auf CREATE/ALTER/DROP-Anweisungen (so können Sie wissen, wer erstellt was für ein Tisch, wenn fallen gelassen Spalte, was, Wann, etc..)

Ehrlich gesagt, mithilfe von Triggern in den 3 Szenarien, die ich nicht sehen, warum würden Sie jemals brauchen werden, um "deaktivieren" Sie.

Die Faustregel ist die:verwenden Sie nicht löst.Wie bereits erwähnt, fügen Sie Verwaltungsaufwand und die Komplexität, die leicht vermieden werden durch verschieben der Logik von der DB-Schicht.

Auch in MS SQL Server Trigger ausgelöst werden einmal pro sql-Befehl, und nicht pro Zeile.Für Beispiel, die folgende sql-Anweisung auszuführen, die nur einmal ausgelöst.

UPDATE tblUsers
SET Age = 11
WHERE State = 'NY'

Viele Menschen, einschließlich mir selbst, waren unter dem Eindruck, dass der Trigger ausgelöst werden auf jede Zeile, aber das ist nicht der Fall.Wenn Sie eine sql-Anweisung, wie oben, das kann sich ändern-Daten in mehr als einer Zeile, möchten Sie vielleicht, um einen cursor zum aktualisieren aller Datensätze betroffen, die durch den trigger.Sie können sehen, wie dieses bekommen verworrene sehr schnell.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top