Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_6-15.doc
Скачиваний:
6
Добавлен:
01.03.2025
Размер:
1.43 Mб
Скачать

3.2.4Создание триггера типа delete — до 10 мин.

Перейдем к более сложному примеру – триггер типа DELETE, который каскадирует изменения в связанные таблицы. Мы создадим триггер, который будет удалять строки из таблиц sales, roysched и titleauthor базы данных pubs, когда соответствующая строка удаляется из таблицы titles. Мы будем использовать таблицу deleted, чтобы указывать, какие строки нужно удалить из связанных таблиц. (Напомним, что при удалении какой-либо строки из таблицы триггера эта строка копируется в таблицу deleted; затем вы можете проверить содержимое таблицы deleted и удалить соответствующие записи в других таблицах.) Чтобы этот триггер мог работать, нам нужно было бы удалить ограничения FOREIGN KEY из таблиц titleauthor, roysched и sales, которые связаны с колонкой title_id таблицы titles. В данном примере мы создадим триггер так, как будто этих ограничений FOREIGN KEY не существует. Если все же попытаться удалить строку из таблицы titles, не удалив ограничений FOREIGN KEY, то вы получите сообщение об ошибке от SQL Server и удаление не произойдет.

Ниже показана программа T-SQL для этого триггера:

CREATE TRIGGER Delete_Title ON titles FOR DELETE

AS

DELETE sales

FROM sales, deleted

WHERE sales.title_id = deleted.title_id

PRINT "Deleted from sales"

DELETE roysched

FROM roysched, deleted

WHERE roysched.title_id = deleted.title_id

PRINT "Deleted from roysched"

DELETE titleauthor

FROM titleauthor, deleted

WHERE titleauthor.title_id = deleted.title_id

PRINT "Deleted from titleauthor"

GO

Чтобы проверить этот триггер, используйте оператор DELETE следующим образом:

DELETE titles WHERE title_id = "PC1035"

Если выполнить этот оператор DELETE, то произойдет активизация триггера (при условии, что вы удалили отмеченные выше ссылки на внешние ключи [FOREIGN KEY]). Вы увидите сообщение с количеством затронутых строк для события модификации данных по таблице titles, после которого следуют сообщения, заданные в трех операторах PRINT из этого триггера, и сообщения о количестве затронутых строк в трех других таблицах; эти выходные сообщения показаны ниже:

(1 row(s) affected)

Deleted from sales

(5 row(s) affected)

Deleted from roysched

(1 row(s) affected)

Deleted from titleauthor

(1 row(s) affected)

Еще одно применение таблицы deleted – это сохранение всех строк, удаленных из таблицы, в резервной таблице для последующего анализа данных. Например, чтобы сохранить строки, удаленные из таблицы roysched, в новой таблице с именем roysched_backup, используйте следующую программу:

CREATE TABLE roysched_backup

( title_id tid NOT NULL,

lorange int NULL,

hirange int NULL,

royalty int NULL )

CREATE TRIGGER tr_roysched_backup ON roysched FOR DELETE

AS

INSERT INTO roysched_backup SELECT * FROM deleted

GO

SELECT * FROM roysched_backup

GO

Отметим, что мы присвоили резервной таблице те же имена колонок и те же типы данных, что и в исходной таблице. Вы можете использовать другие имена колонок для таблицы roysched_backup, но обязаны использовать одинаковые типы данных для обеих таблиц, чтобы обеспечить совместимость.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]