Главная » Microsoft SQL Server, Базы данных » Триггеры DDL

0

Триггером называется программный код, который выполняется в результате некоторого действия. Триггеры DML запускаются на выполнение в результате выполнения инструкций DML — INSERT, UPDATE и DELETE. выполняются в результате инструкций CREATE, ALTER и DROP. Триггеры DML отвечают на изменения данных, а триггеры DDL — на изменения схемы. Триггерам DDL будет посвящена отдельная глава; в этом разделе мы всего лишь коснемся темы и приведем несколько примеров.

появились в версии SQL Server 2005 и предназначены для ауди- Новинка    та изменений на уровне схемы.

2005

могут отвечать на изменения уровня либо схемы базы данных, либо сервера. Так как триггеры могут реагировать на множество типов событий и команд, команды, вызвавшие триггер, передаются ему в формате XML с помощью функции Event Data ().

Дополнительная Лучше узнать о триггерах DML и областях их применения вы сможете в главе 23.

информация

Создание и изменение триггеров DDL

создаются и изменяются с использованием синтаксиса, аналогичного триггерам DML. Область применения триггера задается в предложении ON либо параметром ALL SERVER, либо DATABASE (именно “DATABASE”, а не имя базы данных).

CREATE | ALTER TRIGGER TriggerName ON ALL SERVER | DATABASE {WITH параметр}

FOR | AFTER тип_события or группа_событий, . . .n AS

программный код

Аргументами могут выступать ключевые слова encryption и execute as — они оба доказали свою востребованность в триггерах аудита системного уровня. Существуют десятки событий и их групп — по одному для каждого типа операции DDL, которая может быть выполнена на сервере или в базе данных. Несколько наиболее интересных событий перечислены в этом разделе, с остальными вы можете ознакомиться в утилите Books Online.

уровня сервера могут отвечать на следующие события.

?               Alter Authorization Server (изменения в сервере авторизации).

?               Create|Alter|Drop Database (создание, изменение и удаление базы данных).

?               Create[Alter|Drop Login (создание, изменение и удаление регистрационной записи).

?               Create|Drop Endpoint (создание и удаление концевой точки).

?               Create|Alter|Drop Server Access (создание, изменение и удаление уровня доступа к серверу).

уровня базы данных отвечают на следующие события.

?               Create|Alter|Drop Application Role (создание, изменение и удаление роли приложения).

?               Grant|Deny|Revoke Database (предоставление, отзыв и запрет доступа к базе данных).

?               Create|Drop Event Notification (создание и удаление уведомления о событии).

?               Create|Alter|Drop Function (создание, изменение и удаление функции).

?               Create|Alter|Drop Index (создание, изменение и удаление индекса).

?               Create|Alter|Drop Procedure (создание, изменение и удаление процедуры).

?               Create|Alter|Drop Role (создание, изменение и удаление роли).

?               Create|Alter|Drop Schema (создание, изменение и удаление схемы).

?               Create|Alter|Drop Synonym (создание, изменение и удаление синонима).

?               Create|Alter|Drop Table (создание, изменение и удаление таблицы).

?               Create|Alter|Drop Trigger (создание, изменение и удаление триггера).

?               Create|Alter|Drop User (создание, изменение и удаление пользователя).

?               Create|Alter|Drop View (создание, изменение и удаление представления).

?               Create|Alter|Drop XML Schema Collection (создание, изменение и удаление коллекции схем XML).

В утилите Management Studio триггеры уровня баз данных перечислены в узле Programmability окна Object Explorer. Триггеры баз данных могут быть запрограммированы, но не так легко изменены, как другие программные объекты, такие как хранимые процедуры. Триггеры уровня сервера перечисляются в узле Server Ob j ects окна Object Explorer.

Получить список триггеров DDL уровня базы данных можно программным путем, выполнив запрос к представлению каталога systriggers или sysevents. Список серверных триггеров можно получить в представлениях sysserver_triggers и sysserver_trigger_events.

Для удаление триггера DDL используется инструкция DROP TRIGGER:

DROP TRIGGER имя_триггера

Функция EventData ()

могут отвечать на множество различных событий, и поэтому им нужен некоторый метод получения данных о том событии, которое их инициировало. Триггеры DML имеют логические таблицы вставки и удаления; триггеры DDL имеют функцию EventData (). Эта функция возвращает данные о событии в формате XML. Схема XML варьируется в зависимости от типа события. Следует обратить внимание на то, что части схемы XML чувствительны к регистру символов.

Используя функцию EventData () для заполнения переменной XML, триггер может использовать запросы XQuery для исследования значений.

-Дополнительная Более подробно об XML и запросах XQuery вы узнаете в главе 31.

информация

В следующем примере триггер DDL извлекает информацию об изменениях в таблицах базы данных СНА2 и записывает эти изменения в таблицу аудита:

USE СНА2;

CREATE TABLE SchemaAudit (

AuditDate DATETIME NOT NULL,

UserName VARCHAR(50) NOT NULL,

Object VARCHAR(50) NOT NULL,

DDLStatement VARCHAR(max) NOT NULL )

go

CREATE TRIGGER SchemaAudit ON DATABASE

FOR CREATE_TABLE, ALTER__TABLE, DROP_TABLE AS

DECLARE @EventData XML SET @EventData = EventData()

INSERT SchemaAudit (AuditDate, UserName, Object, DDLStatement)

SELECT

GetDate(),

©EventData.value(‘data(/EVENT_INSTANCE/UserName)[1]’ ,

‘SYSNAME’),

@EventData.value(‘data(/EVENT_INSTANCE/ObjectName) [1] ‘,

‘VARCHAR(50) 1 ) ,

@EventData.value(1 data(/EVENT_INSTANCE/TSQLCommand/CommandText) [1] ‘ , •VARCHAR(max)’)

GO

CREATE TABLE Test (

PK INT NOT NULL )

GO

DROP TABLE Test GO

SELECT * FROM SchemaAudit

Будет получен следующий результат:

AuditDate                      UserName Object DDLStatement

2006-03-07 13:07:24.437 dbo            Test CREATE TABLE Test (PK INT NOT NULL)

2006-03-07 13:07:24.450 dbo            Test DROP TABLE Test

Включение и отключение триггеров DDL

могут быть включены и отключены. И это хорошо, поскольку администраторы баз данных должны иметь простую методику отключения триггеров DDL, которые откатывают любые изменения в схеме. Следующий программный код отключает, а затем снова включает триггер SchemaAudit:

DISABLE TRIGGER SchemaAudit ON Fami ly ;

ENABLE TRIGGER SchemaAudit ON Family;

Резюме

Логическая схема базы данных часто требует правок, чтобы служить в качестве физической схемы. Практически невозможно, чтобы физическая схема базы данных имела форму логической и стала сразу работать без применения ограничений, ключей и типов данных. Зная возможности определения таблиц в SQL Server, вы можете реализовать некоторые функции проекта на уровне серверных ограничений, а не в коде Т-SQL триггера или хранимой процедуры.

Настоящая глава представила вам программный код создания физической схемы базы данных. В следующих главах мы продолжим тему программирования. При этом первые несколько глав будут посвящены языку Т-SQL; в остальных мы рассмотрим платформу .NET и другие технологии программирования.

Программирование на языке Transact-SQL

Стандартные инструкции языка манипулирования данными DML предназначены только для извлечения и изменения данных. Этот язык лишен средств разработки процедур и алгоритмов, а также команд настройки сервера и управления им. В качестве компенсации любая конкретная реализация языка SQL дополняет его своими расширениями.

Язык Transact-SQL, больше известный как Т-SQL, является реализацией стандарта SQL, дополненной набором расширений Microsoft. Основной задачей языка Т-SQL является обеспечения программиста набором средств проектирования транзакционных баз данных.

Язык Т-SQL часто ассоциируют с хранимыми процедурами, но на самом деле он представляет нечто большее. В приложениях “клиент/сервер” он может быть задействован несколькими способами.

?               Т-SQL может использоваться в выражениях как часть команд DML INSERT, UPDATE и DELETE, порожденных клиентским процессом.

?               Т-SQL может использоваться в программных блоках, направляемых от клиента к серверу.

?               Функции Т-SQL могут использоваться в качестве выражений в ограничениях проверки.

?               Код Т-SQL может использоваться в хранимых цроце- дурах, функциях и триггерах сервера баз данных.

Вопросы программирования в настоящей книге мы начали рассматривать с главы 7, и начали с инструкций DML, которые лежат в самом сердце языка Т-SQL. В этой главе мы всего лишь рассмотрим программные элементы, необходимые для создания серверных приложений. Программные средства, рассматриваемые в настоящей главе, являются основой создания хранимых процедур, пользовательских функций и триггеров.

Несмотря на то что версия SQL Server 2005 внесла в систему элементы общеязыковой среды выполнения CLR и платформы .NET, язык Т-SQL остался лучшим средством доступа к базе данных.

Источник: Нильсен, Пол. Microsoft SQL Server 2005. Библия пользователя. : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2008. — 1232 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии