Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SUBD_metodichka.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
986.62 Кб
Скачать

Удаление хранимой процедуры

Синтаксис команды

DROP PROCEDURE| PROC <имя процедуры>

Пример 91

Задача.

Удалить процедуру PStudent .

Решение.

DROP PROC PStudent

Лабораторная работа №8

Цель занятия: Знакомство с объектами СХЕМЫ БАЗЫ ДАННЫХ. Создание и использование триггеров.

Триггер – это специальный тип хранимой процедуры, которая автоматически выполняется при возникновении некоторого события (попытке выполнить операции удаления, добавления, редактирования). Как и любой объект базы данных триггер создается с помощью команды CREATE.

Cинтаксис команды создания триггера

CREATE TRIGGER <имя триггера>

ON <имя представления или таблицы>

[WITH INCRYPTION]

{{{FOR|AFTER}<[DELETE][,][INSERT] [,][UPDATE]>}|INSTEAD OF}

[WITH APPEND]

[NOT FOR REPLICATION]

AS

<SQL –ОПЕРАТОР

….

….

….>,

где

ON - имя объекта, для которого триггер используется

WITH INCRYPTION – кодирует текст представления.

WITH APPEND – используется для совместимости с версией 6.5

NOT FOR REPLICATION – меняет правила запуска триггера. Такой триггер не будет стартовать при выполнении над таблицей операций связанных с репликацией данных.

При срабатывании триггера создаются таблицы INSERTED, DELETED. INSERTED – для хранения добавленных записей, DELETED – для хранения удаленных записей. Таблицы видимы только для триггера и существуют только при выполнении триггера.

Таблица может иметь произвольное количество триггеров любых типов (INSERT, UPDATE, DELETE). По умолчанию триггер выполняется, когда изменение данных завершено; если же указать опцию INSTEAD OF, то создаётся триггер, выполняющийся вместо изменения данных.

Изменить триггер можно с помощью оператора ALTER TRIGGER.

В Microsoft SQL Server 2000 используются два типа триггеров AFTER (после) и INSTEAD OF (вместо), а также три их типа: INSERT, UPDATE, DELETE. Триггеры вставки INSERT – стартуют каждый раз при добавлении в таблицу новой записи при этом создается таблица INSERTED. Триггеры удаления DELETE – стартуют каждый раз при удалении из таблицы записи и, как следствие этого, создается таблица DELETED. Триггер правки UPDATE – стартует при внесении изменений в существующие записи таблицы, так как при правке выполняются две операции удаления и вставки, то и служебных таблиц создается две INSERTED и DELETED.

Триггеры не имеют параметров и не выполняются явно, это значит, что триггер запускается только при попытке изменения данных, событие, заставляющее триггер выполнять свои действия, называется разрешающим событием и обычно говорят, что оно запускает триггер.

По умолчанию все триггеры (INSERT, UPDATE, DELETE) срабатывают после выполнения оператора изменения данных – это триггеры AFTER. Триггеры АFTER не используются для представлений. Кроме того, в SQL Server 2000 используются триггеры INSTEAD OF, которые выполняются вместо оператора предполагаемого изменения данных. Триггеры всегда составляют часть транзакции. Если триггер (или другая часть транзакции) терпит неудачу, то транзакция отменяется.

Существует как минимум три причины, по которым используются триггеры.

Во-первых, триггер может быть запущен независимо от разрешившего его приложения для отмены подозрительных действий. Например, один из приведенных ниже триггеров (см. Пример 93) выполнит откат транзакции при попытке обновить данные в столбце оценка после окончания сессии.

Во-вторых, триггер может контролировать ограничения целостности. В прошлом триггеры были единственным средством обеспечения ссылочной целостности. Начиная с SQL Server 7, появилась возможность использовать средства декларативной ссылочной целостности, которые более надежны и предпочтительнее. Отметим три случая, когда триггер все-таки может иметь место:

  • по деловому регламенту требуется ссылаться на данные из отдельной таблицы;

  • в соответствии с регламентом необходимо проверять дельту (разницу между величинами до и после модификации);

  • возникает необходимость в написании собственных сообщений об ошибках.

В-третьих, триггеры, позволяют поддерживать некоторую избыточность данных в базе данных. Авторы пособия считают, что избыточность в базе данных значительно снижает ее надежность и эффективность, и тем не менее все-таки с ней приходится сталкиваться. Ранее и мы отступили от своих принципов и ввели в отношение Student избыточный столбец MarkAVG теперь пришла пора позаботиться, чтобы данные, хранящиеся в нем были актуальны.

Пример 92

Задача.

Написать триггер, запрещающий корректировать данные в таблице PROGRESS между сессиями.

Решение.

CREATE TRIGGER ProgressTerm

ON PROGRESS

FOR INSERT, UPDATE, DELETE

AS

IF EXISTS

( SELECT 'TRUE'

FROM Progress

WHERE (DATEPART(mm,getDATE())<>'01' AND NTerm %2=1)

OR (DATEPART(mm,getDATE())<>'06' AND NTerm %2=0))

BEGIN

RAISERROR('Нельзя исправлять оценку!!!',20,1)

/*-- Откат транзакции в случае возникновения ошибки*/

ROLLBACK TRAN

END

Теперь любая попытка вставить или изменить данные в период отличный от оговоренного, например попытка 14 декабря выполнить действия

UPDATE Progress SET mark=2 WHERE NRecordBook='050001'

INSERT INTO progress VALUES ('050001',1,2,1,4,5)

вызовет сообщение:

Server: Msg 50000

Нельзя исправлять оценку!!!

Пример 93

Задача.

Создать триггер, запрещающий изменять записи для нечетного семестра всегда, кроме января, для четных семестров всегда кроме июня.

Решение.

CREATE TRIGGER ProgressTerm

ON PROGRESS

FOR INSERT, UPDATE, DELETE

AS

IF EXISTS

( SELECT 'TRUE'

FROM progress

WHERE (DATEPART(mm,getDATE())<>'01' AND NTerm %2=1)

OR (DATEPART(mm,getDATE())<>'06' AND NTerm %2=0))

BEGIN

RAISERROR('Сессия завершена! Правка запрещена !!!',16,1)

/*-- Откат транзакции в случае возникновения ошибки*/

ROLLBACK TRAN

END

Теперь попытка ввода или редактирования данных в период между сессиями:

update Progress SET mark=2 WHERE NRecordBook='050001'

INSERT INTO Progress

VALUES ('050001',1,2,1,4,5)

UPDATE Progress SET mark=2

WHERE NRecordBook='050001'

потерпит неудачу и будет выдано сообщение

Server: Msg 50000

Сессия завершена! Правка запрещена !!!

Пример 94

Задача.

Написать триггер, удаляющий строки в таблице Progress относящиеся к записям удаляемым из отношения Student.

Решение

CREATE TRIGGER StudentProgress

ON Student

FOR INSERT, UPDATE, DELETE

AS

DECLARE @COUNT int

SELECT @COUNT=COUNT(*) FROM DELETED

-- Проверяем удалялись ли из главной таблицы Student какие-либо записи.

-- Если да, то удаление необходимо выполнить и из зависимой таблицы

IF @COUNT>0

BEGIN

DELETE FROM PROGRESS

FROM DELETED D

JOIN PROGRESS P

ON D.NRecordBook=P.NRecordBook

END

Пример 95

Задача.

Создать триггер, запрещающий исправлять оценку в отношении Progress на более высокую.

Решение

CREATE TRIGGER Update1Progress

ON PROGRESS FOR UPDATE

AS

IF EXISTS

( SELECT 'TRUE'

FROM INSERTED I

LEFT JOIN DELETED D

ON D.NRecordBook=I.NRecordBook

WHERE I.mark>D.mark)

BEGIN

RAISERROR('Нельзя исправлять оценку!!!',16,1)

-- Откат транзакции в случае возникновения ошибки

ROLLBACK TRAN

END

Теперь выполнение команды, пытающейся заменить оценку 3 на оценку 4

UPDATE Progress

SET mark=4

WHERE NRecordBook='050001'

Завершится следующим сообщением

Server: Msg 50000

Нельзя исправлять оценку!!!

Триггеры можно включать и выключать с помощью команды ALTER.

Cинтаксис команды

ALTER TABLE <имя таблицы>

<ENABLE|DISABLE> TRIGGER <ALL|<имя триггера>>

Задание 31

Создать триггер, запрещающий добавление строк в таблицу PLAN.

Задание 32

Создать триггер, запрещающий обновление строк в таблице SUBJECT.

Задание 33

Создать триггер, запрещающий обновление строк в таблице WORK.

Задание 34

Создать хранимую процедуру, выполняющую вставку строк в таблицу Progress и триггер, который будет срабатывать на вставку строк и будет подсчитывать средний балл вводимого студента и выводить его фамилию и средний балл (по экзаменам).

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