Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР7.doc
Скачиваний:
16
Добавлен:
05.05.2019
Размер:
851.46 Кб
Скачать
  1. Триггеры

Структура триггера на языке .NET практически такая же, как для хранимой процедуры. В листинге 4.15 представлен пример "пустого" триггера. Обратите внимание на атрибут метода trigger1 и его свойства. Свойство Name указывает на имя триггера, свойство Target — на таблицу, к которой будет относиться данный триггер DML, свойство Event — на тип триггера и событие, на которое должен реагировать триггер.

Листинг 4.15

using System;

using System.Data;

using System.Data.SqlClient;

using Microsoft.SqlServer.Server;

public partial class Triggers

{

[Microsoft.SqlServer.Server.SqlTrigger(Name = "Trigger1", Target = "students", Event = "FOR INSERT")]

public static void Trigger1()

{

}

}

Листинг 4.16

drop trigger dbo.mytrigger

drop assembly sql4

go

create assembly sql4

from 'F:\sql\sql4\sql4\bin\Release\sql4.dll'

with permission_set = safe

go

create trigger mytrigger

on dbo.students

after insert

as

external name sql4.Triggers.Trigger1

Поставим целью создать триггер, который помещал бы в некоторую таблицу сообщения об операциях, осуществляемых над таблицей, к которой данный триггер относится. Тут прежде всего возникает проблема: как определить, какая операция вызвала запуск триггера? Для этого используется класс SqiTriggerContext. Создать объект класса явно нельзя. Это можно сделать посредством класса sqlcontext.Triggercontext следующим образом:

SqlTriggerContext tcon = SqlContext.TriggerContext;

После чего посредством объекта tcon уже можно получить всю необходимую информацию о произведенном действии (листинг 4.17). Как и в обычном триггере имеется прямой доступ к таблицам inserted и deleted, из которых можно легко почерпнуть детали изменений, произведенных (или которые будут произведены, если имеется тип instead off) в таблице

Листинг 4.17

using System;

using System.Data;

using System.Data.SqlClient;

using Microsoft.SqlServer.Server;

public partial class Triggers

{

[Microsoft.SqlServer.Server.SqlTrigger(Name = "Trigger1", Target = "students", Event = "FOR INSERT,DELETE,UPDATE")]

public static void Trigger1()

{

SqlTriggerContext tcon = SqlContext.TriggerContext;

String rep = "";

// определяем, какое действие вызвало запуск триггера

if (tcon.TriggerAction == TriggerAction.Delete)

{

rep = "DELETE occurred in table";

}

if (tcon.TriggerAction == TriggerAction.Insert)

{

rep = "INSERT occurred in table";

}

if (tcon.TriggerAction == TriggerAction.Update)

{

rep = "UPDATE occurred in table";

}

SqlConnection conn = new SqlConnection("context connection=true");

// открываем соединение

conn.Open();

SqlCommand cmd = new

SqlCommand("insert into reports (report) values('" + rep + "')");

// команда будет выполняться на открытом соединении

cmd.Connection = conn;

// выполняемый запрос

cmd.ExecuteNonQuery();

}

}

У класса SqlTriggerContext есть свойство EventData. Свойство имеет тип xml и содержит информацию о DDL-событии: время события, соединение, тип события. В случае события DML данное свойство равно null