as external name
TestingYukon:CTriggerTest::AnotherTrigger",
tableName);
cmd.ExecuteNonQuery();
}
}
Этот несложный DDL-триггер с каждой создаваемой в
текущей базе таблицей связывает DML триггер на вставку. Имя таблицы, на которой
произошло срабатывание, извлекается из свойства SqlChars
SqlTriggerContext.EventData. Это пока недокументированное (к сожалению)
свойство предоставляет исчерпывающую информацию о событии, вызвавшем
срабатывание триггера, в формате XML. Вот так выглядит типичное значение, попадающее в наш триггер:
<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()
{
Рекомендуем скачать другие рефераты по теме: диплом государственного образца, реферат по экологии.