Відомі обмеження тригерів

Створення та оптимізація тригерів у SQL Server

Florin Angelescu

Instructor

Переваги тригерів

  • Використовують для цілісності бази даних
  • Застосовують правила бізнес-логіки прямо в базі даних
  • Контролюють, які оператори дозволені в базі даних
  • Реалізують складну бізнес-логіку, запущену однією подією
  • Простий спосіб аудиту баз і дій користувачів
Створення та оптимізація тригерів у SQL Server

Недоліки тригерів

  • Їх важко побачити й виявити
  • Невидимі для клієнтських застосунків і під час налагодження коду
  • Складно відстежувати логіку під час усунення несправностей
  • Можуть створювати навантаження на сервер і сповільнювати його
Створення та оптимізація тригерів у SQL 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           |...|
Створення та оптимізація тригерів у SQL Server

Пошук тригерів бази даних і таблиць

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                     |
Створення та оптимізація тригерів у SQL Server

Перегляд визначення тригера (варіант 1)

Перегляд визначення тригера в 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);
Створення та оптимізація тригерів у SQL Server

Перегляд визначення тригера (варіант 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); |
Створення та оптимізація тригерів у SQL Server

Перегляд визначення тригера (варіант 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); |
Створення та оптимізація тригерів у SQL Server

Перегляд визначення тригера (варіант 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); |
Створення та оптимізація тригерів у SQL Server

Найкращі практики для тригерів

Поради:

  • добре задокументований дизайн бази даних
  • проста логіка під час проєктування тригерів
  • уникайте надмірного використання тригерів
Створення та оптимізація тригерів у SQL Server

Давайте потренуємось!

Створення та оптимізація тригерів у SQL Server

Preparing Video For Download...