Frage

Ich versuche, um herauszufinden, ob ich kritische Logik Geschäft in einem Trigger oder Einschränkung innerhalb meiner Datenbank werden soll.
Bisher habe ich Logik in Trigger hinzugefügt, wie es mir die Kontrolle über das gibt, was als nächstes passiert und bedeutet, dass ich Nachrichten benutzerdefinierte anstelle eines Fehlers zur Verfügung stellen kann, die wahrscheinlich die Benutzer verwirren.

Gibt es eine spürbare Leistungssteigerung Einschränkungen über Trigger bei der Verwendung und was sind die besten Methoden für die Bestimmung, welche zu verwenden.

War es hilfreich?

Lösung

Constraints Hände nach unten!

  • Mit Einschränkungen geben Sie relationalen Prinzipien, das heißt Fakten über Ihre Daten. Sie müssen nie Ihre Zwänge ändern, es sei denn, einige Tatsache Änderungen (das heißt neue Anforderungen).

  • Mit Trigger festgelegt, wie Daten zu verarbeiten (in Einfügungen, Aktualisierungen etc.). Dies ist eine "non-relational" Art und Weise, Dinge zu tun.

Um zu erklären, mich besser mit einer Analogie: der richtige Weg, um eine SQL-Abfrage zu schreiben, ist zu spezifizieren „was Sie wollen“ statt „wie es bekommen“ - lassen Sie die RDBMS den besten Weg finden, um es für Sie zu tun. Auch hier gilt:., Wenn Sie Trigger verwenden Sie im Auge verschiedene Dinge wie die Reihenfolge der Ausführung zu halten haben, Kaskadierung, etc ... Lassen Sie SQL tun, dass für Sie mit Einschränkungen, wenn möglich

Das ist nicht zu sagen, dass Trigger hat keine Anwendungen. Sie tun: manchmal kann man nicht eine Einschränkung verwenden, um einige Tatsache über Ihre Daten angeben. Es ist extrem obwohl selten. Wenn es passiert, Sie viel , dann gibt es wahrscheinlich einige Probleme mit dem Schema.

Andere Tipps

Best Practice : Wenn Sie es mit einem Zwang tun können, eine Einschränkung verwenden.

Trigger sind nicht ganz so schlecht, wie sie in Verruf kommen für (wenn sie richtig verwendet wird), obwohl ich immer eine Einschränkung verwenden würde immer es möglich ist, wo. In einem modernen RDMS sind die Performance-Overhead von Trigger Einschränkungen vergleichbar (natürlich, dass nicht jemand bedeutet nicht horrend Code in einem Trigger platzieren können!).

Manchmal ist es notwendig, einen Auslöser zu verwenden, um einen ‚komplexen‘ Zwang wie die Situation zu wollen erzwingen, dass man erzwingen und nur eine von zwei der Tabelle Fremdschlüsselfeldern besetzt sind (ich habe diese Situation gesehen in einiger Domain Modelle).

Die Debatte, ob die Business-Logik in der Anwendung befinden sollte statt der DB, hängt zu einem gewissen Grad auf die Umwelt; wenn Sie viele Anwendungen den Zugriff auf die DB haben, beide Einschränkungen und Trigger können als letzte Wächter dienen, dass die Daten korrekt sind.

Trigger kann ein Leistungsproblem blüht in. Etwa zur gleichen Zeit, dass sie auch eine Wartung Alptraum worden sind passiert. Sie können nicht herausfinden, was los ist und (Bonus!) Die Anwendung verhält sich unberechenbar mit „falschen“ Datenprobleme. [Wirklich, sind sie Auslöser Probleme.]

Keine Endbenutzer berührt SQL direkt. Sie verwenden Anwendungsprogramme. Anwendungsprogramme enthalten Business-Logik in eine viel intelligenten und besser verwaltbar Weise als Auslöser. Legen Sie die Anwendungslogik in Anwendungsprogrammen. Setzen Sie Daten in der Datenbank.

Es sei denn, Sie und Ihre „Benutzer“ keine gemeinsame Sprache sprechen, können Sie die Einschränkungsverletzungen ihnen erklären. Die Alternative - nicht zu erklären -. Verwandelt sich eine einfache Datenbank in ein Problem, weil es die Daten und den Anwendungscode in einen wartbaren Morast verschmilzt

„Wie kann ich mit absoluter Sicherheit, dass jedes richtig das Datenmodell ist mit?“

Zwei (und eine halbe) Techniken.

  1. Stellen Sie sicher, dass das Modell ist richtig : es bringt die reale Problemdomäne. Keine Hacks oder Abhilfe oder Verknüpfungen, die nur durch komplexe Hand schwenkenden Erklärungen, Stored Procedures und Trigger aussortiert werden kann.

  2. Hilfe definieren, das Geschäftsmodell Schicht der Anwendungen. Die Schicht des Anwendungscodes, die jeder Aktien und Wiederverwendungen.

    a. Auch sicher sein, dass das Modell Schicht der Bedürfnisse der Menschen erfüllt. Wenn das Modell Schicht die richtigen Methoden und Sammlungen hat, gibt es weniger Anreiz, diese zu umgehen direkten Zugriff auf die zugrunde liegenden Daten zu erhalten. Im Allgemeinen, wenn das Modell richtig ist, ist dies nicht eine tiefe Besorgnis.

Trigger ist ein Zug-Wrack warten geschehen. Einschränkungen sind es nicht.

Zusätzlich zu den anderen Gründen Einschränkungen zu verwenden, können die Oracle-Optimierer Einschränkungen verwenden, um es Vorteil ist.

Zum Beispiel, wenn Sie eine Einschränkung sagen (Amount >= 0) haben und dann fragen Sie mit WHERE (Amount = -5) Oracle weiß sofort, dass es keine passenden Zeilen.

Einschränkungen und Trigger sind für 2 verschiedene Dinge. Einschränkungen verwendet werden, um constrain die Domäne (gültige Eingänge) Ihre Daten. Zum Beispiel würde ein SSN als char (9) gespeichert ist, jedoch mit einer Einschränkung von [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [ 0-9] [0-9] [0-9] (alle numerisch).

Trigger ist ein Weg, um Geschäfte zu erzwingen Logik in Ihrer Datenbank. Unter SSN wieder, vielleicht braucht ein Prüfpfad aufrechterhalten werden, wenn ein SSN geändert wird -, dass mit einem Abzug durchgeführt werden würde,

Im allgemeinen Probleme der Datenintegrität in einem modernen RDBMS können mit einiger Variation einer Einschränkung behandelt werden. Allerdings werden Sie manchmal in eine Situation geraten, in unangebrachter Normalisierung (oder geänderte Anforderungen, jetzt unsachgemäße Normalisierung führen) eine Einschränkung verhindert. In diesem Fall kann ein Auslöser der Lage sein, Ihre Einschränkung zu erzwingen - aber es ist undurchsichtig für das RDBMS, dh es ist nicht für die Optimierung verwendet werden kann. Es ist auch „versteckte“ Logik und kann ein Wartungsproblem sein. Die Entscheidung, ob das Schema Refactoring oder einen Auslöser ist ein Urteil Anruf an diesem Punkt verwenden.

Allgemein gesprochen würde ich es vorziehen, Einschränkungen und mein Code würde SQL Server-Fehler und Gegenwart etwas freundlicher für den Benutzer fangen.

@onedaywhen

Sie können eine Abfrage als Einschränkung in SQL Server haben, müssen Sie nur in der Lage sein es in einer skalaren Funktion zu passen: http://www.eggheadcafe.com/software/aspnet/30056435/check-contraints-and-tsql.aspx

@ Mark Brackett: „Constraints verwendet werden, um die Domain zu beschränken ... Trigger sind eine Möglichkeit, Business-Logik der Durchsetzung“: Es ist nicht so einfach in SQL Server, weil seine Einschränkungen Funktionalität zum Beispiel beschränkt ist, noch nicht voll SQL-92. Nehmen Sie das klassische Beispiel eines sequenzierten ‚Primärschlüssel‘ in einer zeitlichen Datenbanktabelle: Im Idealfall würde ich eine CHECK-Einschränkung mit einer Unterabfrage verwenden, um überlappende Perioden für die gleiche Einheit zu verhindern, aber SQL Server kann das nicht, also muß ich ein verwenden auslösen. Auch fehlt von SQL Server ist die SQL-92-Fähigkeit, die Kontrolle von Einschränkungen zu verschieben, sondern sie (in der Tat) überprüfen nach jeder SQL-Anweisung, also wieder ein Trigger notwendig sein kann, um SQL Server Einschränkungen zu arbeiten.

Wenn bei allen möglichen Nutzungsmöglichkeiten. Sie neigen dazu, slighlty schneller zu sein. Auslöser sollte für komplexe Logik verwendet werden, die eine Einschränkung nicht umgehen kann. Trigger-Schreiben ist auch heikel und wenn Sie feststellen, müssen Sie einen Trigger schreiben, stellen Sie sicher, dass Set-basierte Anweisungen verwenden becasue triigers arbeiten gegen die gesamte einfügen, aktualisieren oder löschen (Ja, es wird Zeiten geben, wenn mehr als ein Datensatz betroffen ist, Plan auf das!), nicht nur einen Datensatz zu einem Zeitpunkt. Verwenden Sie keinen Cursor in einem Trigger verwenden, wenn es vermieden werden kann.

Was, ob die Logik in der Anwendung zu bringen, statt einem Abzug oder Einschränkung. TU DAS NICHT!!! Ja, sollten die Anwendungen überprüft, bevor sie die Daten senden, aber die Integrität der Daten und Geschäftslogik auf Datenbankebene sein müssen oder Ihre Daten werden bis bekommen messed wenn mehrere Anwendungen in sie einhaken, wenn die globalen Einsätze outsiide die Anwendung usw. Daten fertig sind Integrität ist der Schlüssel zu Datenbanken und müssen auf Datenbankebene durchgesetzt werden.

@Meff: Es gibt potenzielle Probleme mit dem Ansatz der Verwendung einer Funktion, weil, einfach ausgedrückt, SQL Server CHECK-Einschränkungen wurden mit einer einzigen Zeile als Einheit der Arbeit konzipiert und haben Fehler, wenn sie auf einem resultset arbeiten. sehen für einige weitere Details hierzu: [ http://blogs.conchango.com/davidportas/archive/2007/02/19/Trouble-with-CHECK-Constraints.aspx] [1] .

[1]: David Portas' Blog. Ärger mit CHECK-Einschränkungen

Wie bei Skliwz. Nur, damit Sie eine kanonische Verwendung von Trigger kennen ist Audit-Tabelle. Wenn viele Verfahren Update / Einfügen / Löschen eine Tabelle, die Sie überwachen möchten (die geändert, was und wann), Trigger ist der einfachste Weg, es zu tun. ein Weg ist, einfach einen Flag in der Tabelle (aktiv / inaktiv mit einiger unicity Einschränkung) hinzufügen und etwas in der Audit-Tabelle einfügen.

Eine andere Möglichkeit, wenn Sie die Tabelle wollen die historischen Daten nicht zu halten, ist die ehemalige Zeile in der Audit-Tabelle zu kopieren ...

Viele Menschen haben viele Möglichkeiten, es zu tun. Aber eines ist sicher, werden Sie einen Einsatz für jedes Update / Insert ausführen müssen / Löschen in dieser Tabelle

zu vermeiden, um den Einsatz in Dutzenden verschiedenen Orte schreiben, können Sie hier verwenden, um einen Auslöser.

Ich bin damit einverstanden hier über Einschränkungen mit jedem. Verwenden Sie sie so viel wie möglich.

Es gibt eine Tendenz zur Übernutzung Trigger, vor allem mit neuen Entwicklern. Ich habe Situationen erlebt, in denen ein Trigger einen anderen Trigger auslöst, die einen anderen Trigger auslöst, der den ersten Trigger wiederholt, eine kaskadierende Trigger erstellen, die Ihren Server bindet. Dies ist ein nicht-optimales Benutzer von Triggern; o)

Dass gesagt wird, löst ihren Platz haben und sollten bei Bedarf verwendet werden. Sie sind besonders gut für die Verfolgung von Änderungen in Daten (als Mark Brackett erwähnt). Sie müssen die Frage beantworten: „Wo ist es am sinnvollsten, meine Business-Logik zu setzen“? Die meiste Zeit finde ich es im Code gehört, aber Sie haben einen offenen Geist zu halten.

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