Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка СУБД MySQL Borland Кузин.doc
Скачиваний:
85
Добавлен:
13.05.2015
Размер:
2.85 Mб
Скачать

ОператорSignal

Оператор SIGNALпозволяет вызвать пользовательское исключение и сообщить обработчику или внешней программе информацию о произошедшей ошибке. Синтаксист оператораSIGNAL:

SIGNAL<идентификатор_исключения>

[SET<параметр> = <значение>, [<параметр> = <значение>]...]

Здесь параметр <идентификатор_исключения> может представлять собой значение SQLSTATEили имя исключения, которое было задано при его создании оператором DECLARE ...CONDITION. ЗначениеSQLSTATEне должно начинаться с цифр ‘00’. Для пользовательского исключения следует использовать значениеSQLSTATE45000.

Оператор SIGNALможет включать опциюSET, после которой следуют пары <параметр>=<значение>, разделенные запятыми.

Пример:

CREATE PROCEDURE p (val INT)

BEGIN

DECLARE my_error CONDITION FOR SQLSTATE ‘45000’;

DECLARE EXIT HANDLER FOR my_error SELECT(‘Произошла ошибка!’);

IF val = 0 THEN

SIGNAL my_error;

END IF;

END;

Пример с использованием параметра MESSAGE_TEXT:

CREATE PROCEDURE p (val INT)

BEGIN

DECLARE my_error CONDITION FOR SQLSTATE ‘45000’;

IF val = 0 THEN

SIGNAL my_error SET MESSAGE_TEXT = ‘Произошла ошибка!’;

END IF;

END;

    1. Триггеры

Триггеры - это особые хранимые процедуры, выполняемые в ответ на происхо­дящие в базе данных события. Они относятся к числу наиболее важных элемен­тов промышленных приложений базы данных. Основным назначением триггеров является поддержка ограничений целостности, которые не реализуются при помощи внешних ключей и ограничений, накладываемых на значение столбца (NOT NULL, CHEK и т.д.).

Триггеры уровня инструкций языка манипулирования данными (триггеры DML) запускаются после вставки, обновления или удаления строки конкретной табли­цы. Это наиболее распространенный тип триггеров, особенно часто применяемый разработчиками.

Триггер BEFORE.Вызывается до внесения каких-либо изменений, в том чис­ле до вставки записи (BEFORE INSERT).

Триггер AFTER.Выполняется после того, как производятся все изменения, в частности после операции вставки записи (AFTER INSERT).

Существуют, также, следующие виды триггеров:

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

Триггер уровня записи.Вызывается для отдельной записи, обрабатываемой SQL-инструкцией. Если, предположим, таблица books содержит 1000 строк, то следующая инструкция UPDATE модифицирует все эти строки: UPDATE books SET title = UPPER (title);И если для данной таблицы определен триггер уровня записи, он будет запу­щен 1000 раз.

Псевдозапись NEW. Структура данных с именем NEW, которая так же выгля­дит и обладает такими же свойствами, как и запись таблицы. Эта псевдозапись доступна только внутри триггеров обновления и вставки; она содержит значе­ния модифицированной записи после внесения изменений.

Псевдозапись OLD. Структура данных с именем OLD, которая так же выгля­дит и обладает такими же свойствами, как и запись таблицы. Эта псевдозапись Доступна только внутри триггеров обновления и удаления; она содержит зна­чения модифицируемой записи до внесения изменений.

Синтаксис оператора создания триггера:

CREATETRIGGER<имя_триггера> {BEFORE|AFTER} <событие_БД>

ON <имя_таблицы> FOR EACH ROW

BEGIN

<операторы>

END

<событие_БД>- определение типа DML-инструкции, с которой связывается триггер: INSERT, UPDATE или DELETE. У каждой таблицы для каждого события может существовать только один триггер.

Триггер, осуществляющий проверку веса детали при добавлении ее в таблицу Parts(вес не должен превышать заданного значения)

CREATE TRIGGER Check_Weight BEFORE INSERT ON Parts FOR EACH ROW

BEGIN

DECLARE Wrong_weight CONDITION FOR SQLSTATE ‘45000’;

IF NEW.Weight > 1000 THEN

SIGNAL Wrong_weight SET MESSAGE_TEXT = ‘Вес детали превышает 1000!’;

END IF;

END

Триггер, осуществляющий проверку на совпадение наименований деталей:

CREATE TRIGGER Check_Part_Name BEFORE INSERT ON Parts FOR EACH ROW

BEGIN

DECLARE Duplicate_part_name CONDITION FOR SQLSTATE ‘45000’;

DECLARE N INTEGER;

SELECT COUNT(*) INTO N FROM Parts WHERE Part_name=NEW. Part_name;

IF N > 0 THEN

SIGNAL Duplicate_part_name SET MESSAGE_TEXT = ‘Такая деталь уже есть в базе!’;

END IF;

END

Триггер, который удаляет все детали, наименование которых совпадает с удаляемой деталью (не будет работать):

CREATE TRIGGER Delete_the_same_parts AFTER DELETE ON Parts FOR EACH ROW

BEGIN

DELETE FROM Parts WHERE Part_name=OLD.Part_name;

END

http://doc.prototypes.ru/database/mysql/triggers/info/