|
Программирование >> Программирование баз данных
switch (ctxt.TriggerAction) { case TriggerAction.Insert: cmd.CommandText = SELECT COUNT(*) AS NumRows FROM INSERTED ; SqlContext.Pipe.Send( Insert Trigger Fired ); SqlContext.Pipe.ExecuteAndSend(cmd); break; case TriggerAction.Update: Ha этот раз для демонстрации того, как получить доступ к данным из таблиц Inserted и (или) Deleted, используются функции чтения данных SqlContext.Pipe.Send( Update Trigger Fired ); SqlContext.Pipe.Send( inserted rows... ); cmd.CommandText = SELECT * FROM INSERTED ; SqlContext.Pipe.Send(cmd.ExecuteReader()); break; case TriggerAction.Delete: Выполняется проверка, аналогичная той, которая была выполнена применительно к таблице Inserted cmd.CommandText = SELECT COUNT(*) AS NumRows FROM DELETED ; SqlContext.Pipe.Send( Delete Trigger Fired ); SqlContext.Pipe.ExecuteAndSend(cmd); break; SqlContext.Pipe.Send( Trigger Complete ); A сейчас скомпилируем и выгрузим разработанную сборку. Выгрузка сборки, созданной на этот раз, осуидествляется в основном по таком) же принципу, как и выгрузка большинства других сборок, которые рассматривались в данной главе (с учетом того, что в этом случае также не требуется никаких параметров, кроме заданного по умолчанию значения PERjyiISSION SET): CREATE ASSEMBLY ExampleTrigger FROM <solution path>\ExampleTrigger\bin\Debug\ExampleTrigger.dll Тем не менее, чтобы получить возможность создать ссьипсу на триггер, необходимо вначале подготовить таблицу. Для рассматриваемого примера достаточно создать очень простую таблицу: CREATE TABLE TestTrigger РК int NOT NULL PRIMARY KEY, Value varchar(max) NOT NULL После выгрузки сборки и создания таблицы можно создать ссьыку на триггер. Во многом аналогично хранимым процедурам и функциям, для создания триггера .NET применяется почти такой же оператор, как и при создании триггеров на основе языка T-SQL. Но часть кода T-SQL исключается и заменяется объявлением EXTERNAL NAME: CREATE TRIGGER trgExampleTrigger ON TestTrigger FOR INSERT, UPDATE, DELETE AS EXTERNAL NAME ExampleTrigger.Triggers.ExampleTrigger После вьшолнения этого оператора триггер должен быть связан с таблицей и готов к активизации при любом действии, вызывающим активизацию триггера (что касается также любых других действий, относящихся к рассчитанным на них триггерам), поэтому мы можем проверить подготовленный нами триггер. Начнем с операции, предусматривающей вставку нескольких строк в таблицу, на которой установлен триггер. Мы уже сталкивались с тем, как работает триггер вставки. Поэтому проверим ту часть триггера, которая касается вставки, по известному нам принципу: INSERT INTO TestTrigger (PK, Value) VALUES (1, first row) INSERT INTO TestTrigger (PK, Value) VALUES (2, second row) После вызова приведенного выше кода на выполнение не только происходит вставка строк в таблицу, но и отображаются короткие сообщения, формируемые в коде триггера: Insert Trigger Fired NumRows (1 row(s) affected) Trigger Complete (1 row(s) affected) Insert Trigger Fired NumRows (1 row(s) affected) Trigger Complete (1 row(s) affected) Итак, очевидно, что задача получения дополнительной информации из триггера вполне осуществима. Обратите внимание на то, что сообщение (1 row (s) affected) получено и по результатам запроса, выполняемого внутри триггера, и после вызова на выполнение оператора, в котором фактически происходит вставка данных. Таким образом, с помощью триггера, создаваемого с использованием средств инфраструктуры .NET, могут быть выполнены любые действия, осутцествимые с применением триггера T-SQL (хотя последний вариант, предусматривающий применение триггера T-SQL, при указанных условиях является намного более эффективным). Но на основе инфраструктуры .NET, в случае необходимости, можно было бы осуществлять гораздо более сложные действия, не выполнимые с помощью триггера T-SQL. Например, можно было бы сделать внешний вызов или выполнить вычисление, не реализуемое с применением средств языка T-SQL. Известная пословица гласит: Предупрежден- значит вооружен. Ее истинность подтверждается и на примере триггеров. Трудно выразить словами, насколько важно соблюдать осторожность, предпринимая любые действия с триггерами. Одно лишь то. что в программе применяются внешние вызовы, уже не позволяет назвать такую программу совершенно безопасной. Использование любых средств диктуется потребностью, поэтому необходимо тщательно проверить, следует ли действительно выполнять внешний вызов из триггера. Следует учитывать, что применение триггера приводит к замедлению, а транзакция, в которой участвует триггер, не заканчивается до тех пор, пока не будет заверилена работа триггера; эпю означает, чпю выполнение внешних вызовов с помощью триггера может привести к значительному снижению производительности. Таким образом, первый этап проверки завершился успешно, поэтому проверим, как происходит обновление: UPDATE TestTrigger SET Value = Updated second row WHERE PK = 2 При этом должны быть получены следующие результаты: Update Trigger Fired inserted rows... PK Value 2 Updated second row (1 row(s) affected) Trigger Complete (1 row(s) affected) Сформированный результирующий набор представляет собой именно тот набор, вывод которого осуществляется с помощью триггера. За этим следуют другой фрагмент вывода и сообщение (1 row(s) affected) , которое обычно формируется при обновлении единственной строки. Так же как и при выполнении оператора вставки, применяемый триггер позволяет контролировать все, что происходит, поэтому открывает возможность реагировать на происходящее. Таким образом, нам осталось только рассмотреть оператор удаления. На этот раз мы удалим все строки и проконтролируем, отражает ли количество строк в таблице deleted тот факт, что удалены обе строки: DELETE TestTrigger И снова проверим полученные результаты: Delete Trigger Fired NumRows (1 row(s) affected) Trigger Complete (2 row(s) affected) Ha этот раз при изучении результатов может возникнуть некоторая путаница, поэтому рассмотрим внимательно, что происходит. Прежде всего формируется сообщение о том, что произошла активизация триггера (напомним, что формирование этого сообщения предусмотрено в самом триггере). Затем отображается результирующий набор, полученный при выполнении оператора
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |