database - prozedur - stored procedure beispiel



Pro und Contra von Triggern gegen gespeicherte Prozeduren für Denormalisierung (2)

Dies hängt von Ihren Geschäftsanforderungen und davon ab, wie Ihre Datenbank verwendet wird. Angenommen, es gibt viele Anwendungen und viele Importe, die die Tabelle beeinflussen (wir haben Hunderte von Dingen, die unsere Tabellen beeinflussen können). Angenommen, es gibt auch gelegentlich die Notwendigkeit, Abfragen zu schreiben, die von SSMS (ja, sogar auf Prod) ausgeführt werden, um beispielsweise alle Preise um 10% zu aktualisieren. Wenn Sie diese Art von Dingen tun, dann ist ein gespeicherter Prozess unpraktisch, Sie werden nie alle möglichen Möglichkeiten haben, die betroffene Datenbank zu beeinflussen.

Wenn diese Datenänderung für die Datenintegrität erforderlich ist oder viele Anwendungen oder Prozesse (Importe, SQL Server-Jobs usw.) Daten beeinflussen können, gehören sie in den Trigger.

Wenn die Datenänderung nur manchmal benötigt wird oder Sie die vollständige Kontrolle darüber haben, wie Daten von nur einer Anwendung geändert werden, ist ein gespeicherter Prozess in Ordnung.

https://src-bin.com

Wenn es darum geht, Daten in einer transaktionalen Datenbank für die Performance zu denormalisieren, gibt es (mindestens) drei verschiedene Ansätze:

  1. Push-Aktualisierungen durch gespeicherte Prozeduren, die sowohl die normalisierten Transaktionsdaten als auch die denormalisierten Berichts- / Analysedaten aktualisieren;

  2. Implementieren Sie Trigger für die Transaktionstabellen, die die sekundären Tabellen aktualisieren. Dies ist fast immer der Weg, der bei der Pflege von Geschichten genommen wird;

  3. Verschieben Sie die Verarbeitung auf einen nächtlichen Batch-Prozess und führen Sie möglicherweise eine ETL in ein Data Mart / Warehouse durch.

Nehmen wir an, dass Option # 3 für die Zwecke dieser Frage nicht praktikabel ist, weil die Domäne die denormalisierten Daten zu jeder Zeit konsistent mit den normalisierten Daten benötigt. Hierarchische Aggregate, mit denen ich mich ziemlich oft beschäftige, sind ein Beispiel dafür.

Ich habe beide der beiden ersten Annäherungen ein gutes Stück gebraucht und in letzter Zeit habe ich mich dem Trigger-basierten Ansatz genähert, aber ich frage mich, ob es irgendwelche "gotchas" gibt, die ich noch nicht entdeckt habe, und dachte darüber nach Es lohnt sich, diese Frage zu stellen, damit ich einige Ideen im Hinterkopf behalten kann, wenn ich langfristige Entscheidungen in der Zukunft treffe.

Was sind Ihrer Meinung nach die Vor- und Nachteile beider Tools für den spezifischen Zweck der Echtzeitspeicherung derormalisierter Daten? In welchen Situationen würdest du eins wählen und warum?

(PS Bitte keine Antworten wie "Trigger sind zu kompliziert" oder "alle Updates sollten immer durch einen gespeicherten Prozess gehen" - machen Sie es für den Kontext der Frage geeignet.)


Answer #1

Trigger sind nützlich, wenn Sie mehrere Pfade in einer Tabelle aktualisieren.

Wir verwenden gespeicherte Procs und haben mindestens 4 Pfade (Hinzufügen, Aktualisieren, Deaktivieren, Kopieren)

Es ist einfacher, mit den Daten zu arbeiten, die wir gerade in einen Trigger eingefügt / aktualisiert haben, egal welche Aktion wir durchführen oder wie viele Zeilen wir beeinflussen.

Ein gespeicherter Proc funktioniert nur für einen einzigen Update-Pfad. Ich fühle: Wenn Sie den Code nicht wiederholen wollen ...

TRY / CATCH in Triggern bedeutet nun korrekte, vorhersehbare Fehlerbehandlung: Trigger auf SQL Server 2000 und früher verursachten Stapelabbrüche bei Fehler / Rollback, was nicht ideal ist (um es gelinde auszudrücken!). Trigger sind also jetzt zuverlässiger.





denormalization