Читайте также:
|
|
Создадим для таблицы authsmall триггер типа DELETE, который будет выводить информацию о попытках удаления и количестве удаляемых строк.
CREATE TRIGGER auth_de1 ON authsmall
FOR DELETE AS
PRINT 'Попытка удаления '+STR(@@ROWCOUNT)+' строк из таблицы authsmall'
PRINT 'Пользователь '+CURRENTUSER
IF CURRENTUSER!= 'dbo'
BEGIN
PRINT 'Удаление запрещено' ROLLBACK TRANSACTION
END ELSE
PRINT 'Удаление разрешено'
Созданный триггер будет выводить информацию о количестве строк, которое пытается удалить пользователь, и имя пользователя, выполнившего команду DELETE. Если пользователь не ' dbo', то удаление запрещается и выдается соответствующее предупреждение.
Выполним следующую команду:
DELETE FROM authsmall WHERE au_fname='Johnson'.
Или
DELETE FROM authsmall WHERE 2*2=5
Создание триггера, который будет разрешать изменение столбца au_id всем, кроме dbo:
CREATE TRIGGER auth_upd_1 ON authsmall FOR UPDATE AS SET NOCOUNT ON
PRINT 'Попытка изменения данных в таблице authsmall'
IF (COLUMNS_UPDATED() & 1)!=0
PRINT 'Изменение столбца au_id'
IF (COLUMNS_UPDATED() & 2)!=0
PRINT 'Изменение столбца au_fname'
IF (COLUMNS_UPDATED() & 4)!=0
PRINT 'Изменение столбца au_lname'
IF UPDATE(phone)
PRINT 'Изменение столбца phone'
IF (CURRENTUSER ='dbo') AND (COLUMNS_UPDATED() & 1)!=0)
BEGIN
PRINT 'Пользователь dbo не может изменять идентификационный номер автора'
ROLLBACK TRANSACTION
END
Попытаемся выполнить изменение телефона и имени автора:
UPDATE authsmall SET phone = '415 986-7020',
au_fname ='John' WHERE au_lname = 'Green'
Или
UPDATE authsmall SET phone = '913 843-7302',
au_id ='748-12-6859' WHERE au_lname = 'Smith'
Создадим триггер, который запретит удаление авторов, которые уже подписали контракт или проживают вне штата Калифорния:
CREATE TRIGGER auth_del ON authors
FOR DELETE AS
DECLARE @@Result int
SET @@Result = 1
IF EXISTS (SELECT * FROM deleted WHERE contract=l)
BEGIN
PRINT ('Попытка удаления автора с подписанным контрактом')
SET @@Result = 0
END
IF EXISTS (SELECT * FROM deleted WHERE state!= 'CA')
BEGIN
PRINT ('Попытка удаления автора, проживающего вне Калифорнии')
SET @@Result = 0
END
IF @@Result = 0
BEGIN
PRINT 'Удаление запрещено**' ROLLBACK TRANSACTION
END
В триггере пришлось ввести локальную переменную @@Result, которая играет роль флага неудачного выполнения удаления.
Выполним следующий запрос:
DELETE FROM authsmall
Будет получен следующий результат:
Попытка удаления автора с подписанным контрактом. Попытка удаления автора, проживающего вне Калифорнии. Удаление запрещено.
Или
DELETE FROM authsmall WHERE city = 'Vacaville'
В качестве примера рассмотрим создание триггера для таблицы auth2, которое создается с помощью следующей команды:
CREATE TRIGGER auth2_trg ON auth2
INSTEAD OF INSERT, UPDATE, DELETE AS
SELECT * FROM inserted
Выполним следующие запросы.
INSERT INTO auth2
VALUES ('123-45-6789', 'Lock', 'Mack')
Результат:
au_id au_lname au_fname
123-45-6789 Lock Mack
(1 row(s) affected)
Варианты лабораторных заданий
Литература
Дата добавления: 2014-12-19; просмотров: 35 | Поможем написать вашу работу | Нарушение авторских прав |