Этот несложный DDL-триггер с каждой создаваемой в
текущей базе таблицей связывает DML триггер на вставку. Имя таблицы, на которой
произошло срабатывание, извлекается из свойства SqlChars
SqlTriggerContext.EventData. Это пока недокументированное (к сожалению)
свойство предоставляет исчерпывающую информацию о событии, вызвавшем
срабатывание триггера, в формате XML. Вот так выглядит типичное значение, попадающее в наш триггер:
<EVENT_INSTANCE>
<PostTime>2004-01-15T04:13:59.600</PostTime>
<SPID>56</SPID>
<EventType>CREATE_TABLE</EventType>
<Database>Northwind</Database>
<Schema>dbo</Schema>
<Object>testtrigger</Object>
<ObjectType>TABLE</ObjectType>
<TSQLCommand>
<SetOptions
ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON"
ANSI_PADDING="ON"
QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
<CommandText>create
table testtrigger(id int identity)
</CommandText>
</TSQLCommand>
</EVENT_INSTANCE>
|
Из всех этих подробностей нас пока интересует только
содержимое элемента <object>, которое вытаскивается банальным регулярным
выражением (не сомневаюсь, что более искушенные разработчики не упустят случая
применить XPath и XSLT). В этом примере выполнялся следующий T-SQL-скрипт:
create
table testtrigger(id int identity)
insert
into testtrigger default values
drop
table testtrigger
--drop
trigger AttachAnotherTrigger on database
|
ПРЕДУПРЕЖДЕНИЕ
Текущая версия MS Visual Studio Whidbey
некорректно обрабатывает удаление DML – триггеров при автоматическом
развертывании. В отличие от обычных триггеров при их удалении нужно указывать
не только имя, но также и контекст (сервер или база данных) с которым связан
триггер. Именно с этим связано наличие закомментированной строки в конце
скрипта.
|
Помимо свойства EventData, у класса SqlTriggerContext
есть еще два свойства.
Свойство TriggerAction (одноименного типа)
предоставляет более удобный доступ к типу действия, вызвавшего срабатывание
триггера, чем элемент <EventType>, содержащийся в EventData.
Для DML-триггеров доступно также свойство bool[] ColumnsUpdated
– массив флагов, определяющих, какие из колонок подверглись изменению.
Аналогичная функциональность в триггерах T-SQL достигается при помощи функции
UPDATE().
Прямого доступа к псевдотаблицам inserted и deleted
нет; но их можно прочитать используя SqlCommand, полученную уже знакомым нам
методом GetCommand() класса SqlContext.
Вот полный текст класса, в котором объявлены оба
триггера:
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlServer;
using System.Data.SqlTypes;
using System.Text.RegularExpressions;
public class CTriggerTest
{
[SqlTrigger
("DATABASE", "AFTER CREATE_TABLE")]
public static void
AttachAnotherTrigger()
{
Рекомендуем скачать другие рефераты по теме: диплом государственного образца, реферат по экологии.
Предыдущая страница реферата | 16
17
18
19
20
21
22
23
24
25
26 | Следующая страница реферата
|
|