- •Visual Studio и sql Server 2005 - начало работы. Проекты.
- •Интеграция в sql Server
- •Хранимые процедуры
- •Пользовательские функции Скалярные функции
- •Табличные функции
- •Триггеры
- •Агрегирующие функции
- •Пользовательские типы данных
- •Программирование на стороне клиента
- •Настройка odbc
- •Программный доступ посредством odbc
- •Классификация api-функций odbc
- •Пример программирования на основе odbc
- •Технология ado.Net Общие сведения
- •Соединение с sql Server
- •Представление базы данных на стороне клиента
- •Средства отображения таблиц
- •Взаимодействие с sql Server и получение результатов Запуск команд на стороне сервера
- •Использование адаптера
- •Контрольные вопросы:
- •Самостоятельная работа:
- •Список литературы:
Триггеры
Структура триггера на языке .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