Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР методичка прог в КС / метод_лаб_программирование_КС_071900_2010.doc
Скачиваний:
46
Добавлен:
10.06.2015
Размер:
337.41 Кб
Скачать

Триггер вставки

В листинге 2 записи, вставляемые в таблицу titles, проверяются на ссылочную целостность по отношению к таблице publishers. Если ка­кая-либо запись нарушает правила ссылочной целостности, транзак­ция вставки откатывается.

Листинг 2. Триггер вставки с проверкой ссылочной целостности

CREATE TRIGGER tr_titles_i

ON titles

FOR INSERT

AS

DECLARE @rows INT -- Переменная для хранения @@ROWCOUNT

SELECT @rows = @@ROWCOUNT

IF @rows = 0 -- Вставленных записей нет, выйти из триггера

RETURN

/* Проверить вставку в столбец pub_id, а также наличие

** pub_id в таблице publishers для всех вставленных pub_id */

IF UPDATE(pub_id) -- Было ли вставлено новое значение pub_id?

AND SELECT COUNT(*)

FROM inserted i, publishers p

WHERE p.pub_id = i.pub_id ) != @rows

BEGIN

RAISERROR ('Invalid pub_id inserted', 16, 1)

ROLLBACK TRANSACTION

END

RETURN

Следующий раздел расширяет приведенный пример и показывает, как проверить ссылочную целостность записей, вставленных в табли­цу titles, посредством сравнения внешних ключей с первичными клю­чами таблицы publishers.

Условный триггер вставки

Записи, нарушающие ссылочную целостность, удаляются из titles, а остальные записи остаются в таблице. В листинге 3 приведена реа­лизация условного триггера вставки, решающего эту задачу.

Листинг 3. Условный триггер вставки

CREATE TRIGGER tr_titles_i

ON titles

FOR INSERT

AS

DECLARE @rows INT -- Переменная для хранения @@ROWCOUNT

SELECT @rows = @@ROWCOUNT

IF @rows = 0 -- Вставленных записей нет, выйти из триггера RETURN

/* Проверить вставку в столбец pub_id, а также наличие

** pub_id в таблице publishers для всех вставленных pub_id

** Все нарушающие записи удаляются из titles */

IF UPDATE(pub_id) -- Было ли вставлено новое значение pub_id?

AND SELECT COUNT(*)

FROM inserted i, publishers p

WHERE p.pub_id = i.pub_id ) != @rows

BEGIN

DELETE titles

FROM titles t, inserted i

WHERE t.pub_id NOT IN

(SELECT pub_id FROM publishers)

RAISERROR ('Some invalid pub_id not inserted', 16, 1)

END

RETURN

Триггер обновления

В этом примере при вставке или обновлении записи sales мы обновляем соответствующий итоговый столбец, ytd_sales, в таблице titles. Листинг 4 показывает, как обновление сводных данных реализуется с помощью триггеров.

Листинг 4. Обновление сводной величины

CREATE TRIGGER tr_total_sales

ON sales

FOR UPDATE, INSERT

AS

DECLARE @rows INT -- Переменная для хранения @@ROWCOUNT

SELECT @rows = @@ROWCOUNT

IF @rows = 0 -- Вставленных записей нет, выйти из триггера

RETURN

IF EXISTS (SELECT * FROM DELETED) AND @rows > 1

BEGIN

PRINT 'Multi-row updates to sales not allowed!'

ROLLBACK TRAN

RETURN

END

/* Обновить ytd_sales в таблице titles значением qty

** в модифицированных записях sales */

IF UPDATE(qty)

BEGIN

UPDATE titles SET ytd_sales = ISNULL(ytd_sales, 0)

/* Функция ISNULL используется на случай отсутствия значений */

/* Сумма по вставкам и удалениям вычисляется в подзапросе */

+ (SELECT ISNULL(SUM(i.qty), 0)

FROM inserted i

WHERE i.title_id = titles.title_id)

- (SELECT ISNULL(SUM(d.qty), 0)

FROM deleted d

WHERE d.title_id = titles.title_id)

END

RETURN