Як подивитися всі тригери SQL?
Для розгляду операцій з тригерами визначимо наступну базу даних productsdb:
CREATE DATABASE productsdb; GO USE productsdb; CREATE TABLE Products INT IDENTITY PRIMARY KEY, ProductId INT NOT NULL, Operation NVARCHAR(200) NOT NULL, CreateAt DATETIME NOT NULL DEFAULT GETDATE(), );
Тут визначено дві таблиці: Products – для зберігання товарів та History – для зберігання історії операцій з товарами.
Додавання
При додаванні даних (під час команди INSERT ) в тригері ми можемо отримати додані дані з віртуальної таблиці INSERTED .
Визначимо тригер, який спрацьовуватиме після додавання:
USE productdb
Цей тригер додаватиме до таблиці History дані про додавання товару, які беруться з віртуальної таблиці INSERTED.
Виконаємо додавання даних у Products та отримаємо дані з таблиці History:
USE productsdb; INSERT INTO Products (ProductName, Manufacturer, ProductCount, Price)
Видалення даних
При видаленні всі видалені дані розміщуються у віртуальній таблиці DELETED :
USE productsdb GO CREATE TRIGGER Products_DELETE ON Products AFTER DELETE AS INSERT INTO History (ProductId, Operation) SELECT Id, 'Видалений товар' + ProductName + 'фірма' + Manufacturer FROM DELETED
Тут, як і у випадку з попереднім тригером, розміщуємо інформацію про віддалені товари в таблицю History.
Виконаємо команду на видалення:
USE productsdb;
Зміна даних
Тригер оновлення даних спрацьовує під час операції UPDATE. І в такому тригері ми можемо використати дві віртуальні таблиці. Таблиця INSERTED зберігає значення рядків після оновлення, а таблиця DELETED зберігає самі рядки, але до оновлення.
Створимо тригер оновлення:
USE productdb
І при оновленні даних спрацює цей тригер:
Отримання інформації про тригери DML
У цьому розділі описано, як отримати відомості про тригери DML у SQL Server за допомогою SQL Server Management Studio або Transact-SQL. До таких відомостей відносяться типи тригерів для таблиці, ім'я тригера, власник тригера та дата створення або зміни тригера. Якщо тригер не був зашифрований під час створення, можна отримати його визначення. За визначенням ви можете зрозуміти, як тригер впливає таблицю, на яку він визначено. Крім того, можна визначити, які об'єкти використовуються цим тригером. Ці відомості можуть бути використані для виявлення об'єктів, які впливають на тригер, якщо вони змінюються або видаляються з бази даних.
У цьому розділі
- Перед початком: Безпека
- Для отримання відомостей про тригери DML використовується:Середовище SQL Server Management StudioTransact-SQL
Перед початком
Безпека
Дозволи
sys.sql.modules, sys.object, sys.triggers, sys.events, sys.trigger_events
Видимість метаданих в уявленнях каталогу обмежена об'єктами, що захищаються, якими володіє користувач або яким користувач отримав деяку роздільну здатність. Для отримання додаткових відомостей див. у розділі Metadata Visibility Configuration.
OBJECT_DEFINITION, OBJECTPROPERTY, sp_helptext
Необхідно бути членом ролі publicВизначення об'єктів користувача видимі власнику об'єкта та одержувачам будь-якого з наступних дозволів: ALTER, CONTROL, TAKE OWNERSHIP і VIEW DEFINITION Ці дозволи неявно надаються членам визначених ролей бази даних. db_owner, db_ddladminі db_securityadmin .
sys.sql_expression_dependencies
Необхідний дозвіл VIEW DEFINITION у базі даних та дозвіл SELECT на подання sys.sql_expression_dependencies у базі даних. За замовчуванням дозвіл SELECT надається лише членам визначеної ролі бази даних. db_owner .Якщо дозволи SELECT і VIEW DEFINITION надані іншому користувачеві, він може переглядати всі залежності в базі даних.
Використання середовища SQL Server Management Studio
Перегляд визначення тригера DML
- У оглядач об'єктів підключіться до екземпляра ядро СУБД, а потім розгорніть екземпляр.
- Розгорніть потрібну базу даних, розгорніть вузол Таблиці, а потім розгорніть таблицю, яка містить тригер, для якого потрібно переглянути визначення.
- Розгорніть вузол Тригери, клацніть правою кнопкою миші потрібний тригер і виберіть команду ЗмінитиУ вікні запиту з'явиться визначення тригера DML.
Перегляд залежностей тригера DML
- У оглядач об'єктів підключіться до екземпляра ядра СУБД, а потім розгорніть екземпляр.
- Розгорніть потрібну базу даних, розгорніть вузол Таблиці, а потім розгорніть таблицю, що містить тригер та залежності, які потрібно переглянути.
- Розгорніть вузол Тригери, клацніть правою кнопкою миші потрібний тригер і виберіть команду Переглянути залежності.
- У вікні залежностей об'єктів перегляньте об'єкти, що залежать від тригера DML, виберіть об'єкти, що залежать від тригера DML. Залежно . Щоб переглянути об'єкти, від яких залежить DML, виберіть об'єкти, від яких назва > тригера DML. Залежно Розгорніть кожен вузол, щоб переглянути всі об'єкти.
- Щоб отримати інформацію про об'єкт, який з'являється в області Залежно , клацніть його. У полі Вибраний об'єкт відомості вказуються на полях Ім'я, Типі Тип залежності .
- Натисніть кнопку ОК , щоб закрити вікно Залежність об'єкта.
Використання Transact-SQL
Перегляд визначення тригера DML
- З'єднайтесь з ядром СУБД.
- На панелі «Стандартна» натисніть Створити запит.
- Скопіюйте та вставте один із наступних прикладів у вікно запиту та натисніть кнопку Виконати. У кожному прикладі показано, як можна переглянути визначення тригера iuPerson.
USE AdventureWorks2022; GO SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID(N'Person.iuPerson'); GO
USE AdventureWorks2022; GO SELECT OBJECT_DEFINITION (OBJECT_ID(N'Person.iuPerson')) AS ObjectDefinition; GO
USE AdventureWorks2022; GO EXEC sp_helptext 'Person.iuPerson' GO
Перегляд залежностей тригера DML
- З'єднайтесь з ядром СУБД.
- На панелі «Стандартна» натисніть Створити запит.
- Скопіюйте та вставте один із наступних прикладів у вікно запиту та натисніть кнопку Виконати. У кожному прикладі показано, як можна переглянути залежність тригера iuPerson.
USE AdventureWorks2022; GO SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name, o.type_desc AS referencing_desciption, COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_mining_id, referenced_server_name, referenced_database_name, referenced_schema_name, referenced_entity_name, COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name, is_caller_dependent, is_ambigu INNER JOIN sys.objects AS ON sed.referencing_id = o.object_id WHERE referencing_id = OBJECT_ID(N'Person.iuPerson'); GO
Перегляд інформації про тригери DML у базі даних
- З'єднайтесь з ядром СУБД.
- На панелі «Стандартна» натисніть Створити запит.
- Скопіюйте та вставте один із наступних прикладів у вікно запиту та натисніть кнопку Виконати. У кожному прикладі показано, як можна переглянути відомості про тригери DML (TR) у базі даних.
USE AdventureWorks2022; GO SELECT name, parent_id, create_date, modify_date, is_instead_of_trigger FROM sys.triggers WHERE type = 'TR'; GO
USE AdventureWorks2022; GO SELECT name, object_id, schema_id, parent_object_id, type_desc, create_date, modify_date, is_published FROM sys.objects WHERE type = 'TR'; GO
USE AdventureWorks2022; GO SELECT OBJECTPROPERTY(OBJECT_ID(N'Person.iuPerson'), 'ExecIsInsteadOfTrigger'); GO
Перегляд відомостей про події, що викликають спрацювання тригера DML
- З'єднайтесь з ядром СУБД.
- На панелі «Стандартна» натисніть Створити запит.
- Скопіюйте та вставте один із наступних прикладів у вікно запиту та натисніть кнопку Виконати. У кожному прикладі показано, як можна переглянути події, що викликають спрацювання тригера iuPerson.
USE AdventureWorks2022; GO SELECT object_id, type, type_desc, is_trigger_event, event_group_type, event_group_type_desc FROM sys.events WHERE object_id = OBJECT_ID('Person.iuPerson'); GO
USE AdventureWorks2022; GO SELECT object_id, type,is_first, is_last FROM sys.trigger_events WHERE object_id = OBJECT_ID('Person.iuPerson'); GO