Limitări cunoscute ale triggerelor

Crearea și optimizarea triggerelor în SQL Server

Florin Angelescu

Instructor

Avantajele triggerelor

  • Utilizate pentru integritatea bazei de date
  • Impun regulile de business direct în baza de date
  • Control asupra instrucțiunilor permise în baza de date
  • Implementarea logicii complexe de business declanșate de un singur eveniment
  • Metodă simplă de auditare a bazelor de date și acțiunilor utilizatorilor
Crearea și optimizarea triggerelor în SQL Server

Dezavantajele triggerelor

  • Dificil de vizualizat și detectat
  • Invizibile pentru aplicațiile client sau la depanarea codului
  • Logica lor este greu de urmărit la depanare
  • Pot reprezenta o suprasarcină pe server și îl pot încetini
Crearea și optimizarea triggerelor în SQL Server

Identificarea triggerelor la nivel de server

SELECT * FROM sys.server_triggers;
| name                 | parent_class_desc | create_date | is_disabled |...|
|----------------------|-------------------|-------------|-------------|---|
| DenyNewDatabases     | SERVER            | 2019-01-22  | 0           |...|
| DenyNewLinkedServers | SERVER            | 2019-01-22  | 1           |...|
| DenyDatabaseDelete   | SERVER            | 2019-01-22  | 1           |...|
Crearea și optimizarea triggerelor în SQL Server

Identificarea triggerelor de bază de date și tabel

SELECT * FROM sys.triggers;
| name                   | parent_class_desc | create_date | is_disabled | is_instead_of_trigger |
|----------------------|-------------------|-------------|---------------|-----------------------|
| TrackRetiredProducts   | OBJECT_OR_COLUMN  | 2019-04-19  | 0           | 0                     |
| PreventOrdersUpdate    | OBJECT_OR_COLUMN  | 2019-04-22  | 0           | 1                     |
| TrackDatabaseTables    | DATABASE          | 2019-04-23  | 0           | 0                     |
| KeepCanceledOrders     | OBJECT_OR_COLUMN  | 2019-04-27  | 0           | 0                     |
| DiscountsPreventDelete | OBJECT_OR_COLUMN  | 2019-04-27  | 0           | 1                     |
| PreventNewDiscounts    | OBJECT_OR_COLUMN  | 2019-04-27  | 0           | 1                     |
| PreventTableDeletion   | DATABASE          | 2019-04-27  | 0           | 0                     |
Crearea și optimizarea triggerelor în SQL Server

Vizualizarea definiției unui trigger (opțiunea 1)

Vizualizarea definiției unui trigger din SSMS

CREATE TRIGGER PreventOrdersUpdate
ON Orders
INSTEAD OF UPDATE
AS
RAISERROR ('Updates on "Orders" table
            are not permitted.
            Place a new order
            to add new products.', 16, 1);
Crearea și optimizarea triggerelor în SQL Server

Vizualizarea definiției unui trigger (opțiunea 2)

SELECT definition
FROM sys.sql_modules
WHERE object_id = OBJECT_ID ('PreventOrdersUpdate');
| definition                                                   |
|--------------------------------------------------------------|
| CREATE TRIGGER PreventOrdersUpdate                           |
| ON Orders                                                    |
| INSTEAD OF UPDATE                                            |
| AS                                                           |
| RAISERROR ('Updates on "Orders" table are not permitted.     |
|             Place a new order to add new products.', 16, 1); |
Crearea și optimizarea triggerelor în SQL Server

Vizualizarea definiției unui trigger (opțiunea 3)

SELECT OBJECT_DEFINITION (OBJECT_ID ('PreventOrdersUpdate'));
| (No column name)                                             |
|--------------------------------------------------------------|
| CREATE TRIGGER PreventOrdersUpdate                           |
| ON Orders                                                    |
| INSTEAD OF UPDATE                                            |
| AS                                                           |
| RAISERROR ('Updates on "Orders" table are not permitted.     |
|             Place a new order to add new products.', 16, 1); |
Crearea și optimizarea triggerelor în SQL Server

Vizualizarea definiției unui trigger (opțiunea 4)

EXECUTE sp_helptext @objname = 'PreventOrdersUpdate';
| Text                                                         |
|--------------------------------------------------------------|
| CREATE TRIGGER PreventOrdersUpdate                           |
| ON Orders                                                    |
| INSTEAD OF UPDATE                                            |
| AS                                                           |
| RAISERROR ('Updates on "Orders" table are not permitted.     |
|             Place a new order to add new products.', 16, 1); |
Crearea și optimizarea triggerelor în SQL Server

Bune practici pentru triggere

Sfaturi:

  • design bine documentat al bazei de date
  • logică simplă în proiectarea triggerelor
  • evitați utilizarea excesivă a triggerelor
Crearea și optimizarea triggerelor în SQL Server

Să exersăm!

Crearea și optimizarea triggerelor în SQL Server

Preparing Video For Download...