Opgeslagen procedures (stored procedures) zijn programmeerbare blokken die expliciet worden aangeroepen en parameters kunnen accepteren, complexe bedrijfslogica kunnen uitvoeren, met transacties kunnen werken, datasets of uitvoerparameters kunnen retourneren.
Triggers (triggers) zijn speciale objecten die "automatisch" worden geactiveerd door gebeurtenissen van gewijzigde gegevens (INSERT, UPDATE, DELETE), en zorgen voor een transparante uitvoering van vooraf gedefinieerde logica bij bepaalde acties op een tabel.
Wanneer procedures gebruiken
Wanneer triggers gebruiken
Opgeslagen procedure:
CREATE PROCEDURE UpdateProductPrice @ProductID int, @NewPrice money AS BEGIN UPDATE Products SET Price = @NewPrice WHERE ProductID = @ProductID; END
Trigger:
CREATE TRIGGER trg_ProductsPriceChange ON Products AFTER UPDATE AS BEGIN INSERT INTO PriceAuditLog(ProductID, OldPrice, NewPrice, ChangeDate) SELECT i.ProductID, d.Price, i.Price, GETDATE() FROM inserted i JOIN deleted d ON i.ProductID = d.ProductID WHERE i.Price <> d.Price END
Q: Is het mogelijk om de volgorde van uitvoering van meerdere AFTER-triggers op dezelfde tabel in SQL Server met standaard middelen te bepalen?
A: Nee, de SQL standaard garandeert niet de volgorde van activatie van AFTER-triggers van dezelfde richting op één tabel. Als de volgorde belangrijk is, moeten ze worden samengevoegd in één.
Verhaal
In een CRM-oplossing voor het ondersteunen van functionaliteit voor wijzigingsgeschiedenis werden triggers gebruikt. Door de hoge belasting van massale updates werden records in de log met vertraging toegevoegd, wat de "live"-operaties blokkeerde en tijdelijke onbeschikbaarheid van de service veroorzaakte.
Verhaal
Een ontwikkelaar maakte de logica voor gegevensvalidatie niet in de procedure, maar in de trigger, in de veronderstelling dat de wijzigingen direct zichtbaar zouden zijn voor de gebruiker. Vergeten dat de trigger "transparant" is, stuitte hij op het probleem dat de bedrijfslogica onduidelijk werd ("magie") en moeilijk te debuggen was.
Verhaal
Belangrijk: Vaak wordt een procedure binnen een trigger aangeroepen, of een trigger vanuit een procedure, wat leidt tot recursie en overschrijding van de geneste limieten — bijvoorbeeld, automatische invoer leidt tot herhaalde activering van de trigger via de verwante procedure.