Procedury składowe (stored procedures) – programowalne bloki, które są wywoływane jawnie i mogą przyjmować parametry, realizować złożoną logikę biznesową, zarządzać transakcjami, zwracać zestawy danych lub parametry wyjściowe.
Triggery (triggers) – specjalne obiekty, które "automatycznie" uruchamiają się przy zdarzeniach zmiany danych (INSERT, UPDATE, DELETE), zapewniając przezroczyste wykonanie określonej logiki przy określonych działaniach na tabeli.
Kiedy używać procedur
Kiedy używać triggerów
Procedura składowa:
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
P: Czy można określić kolejność wykonywania kilku AFTER-triggerów na tej samej tabeli w SQL Server standardowymi środkami?
O: Nie, standard SQL nie gwarantuje kolejności wyzwalania AFTER-triggerów jednego typu na jednej tabeli. Jeśli kolejność jest ważna – należy je połączyć w jeden.
Historia
W rozwiązaniu CRM do wspierania funkcjonalności historii zmian zastosowano triggery. Z powodu dużego obciążenia od masowych aktualizacji wpisy do logu trafiały z opóźnieniem i blokowały "bojowe" operacje, co spowodowało czasową niedostępność usługi.
Historia
Programista stworzył logikę sprawdzania danych nie w procedurze, a w triggerze, oczekując, że zmiany użytkownik zobaczy natychmiast. Zapominając, że trigger jest "przezroczysty", napotkał trudności z tym, że logika biznesowa stała się nieoczywista ("czarna magia") i trudno ją debugować.
Historia
Ważne: Często procedurę wywołują wewnątrz triggera lub trigger z procedury, co prowadzi do rekurencji i przekroczenia limitu zagnieżdżenia – na przykład automatyczne wstawienie prowadzi do ponownego uruchomienia triggera przez powiązaną procedurę.