Изучение средств обеспечения целостности данных в SQL Server 2005. Реализация алгоритмов поддержания целостности с помощью триггеров (Лабораторная работа № 6), страница 3

2.2. Программная реализация требований целостности в БД

Существует два способа реализации требований целостности: при помощи ограничений целостности (декларативная реализация; см. описание лабораторной работы №2) и при помощи триггеров (процедурная реализация).

На стадии программной реализации требования целостности в БД неизбежно возникает вопрос, какой механизм использовать: типовое ограничение целостности или триггеры. Если описатель представляет собой конструкцию вида (3) – (7), можно использовать ограничение целостности:

описатель (2) – ограничение целостности primarykey;

описатель (3) – ограничение целостности unique;

описатель (4) – ограничение целостности notnull;

описатель (5) – ограничение целостности check;

описатель (6) – ограничение целостности foreignkey.

Триггеры целесообразно использовать в тех случаях, когда реализуемое требование целостности не является типовым, охватывает несколько таблиц и (или) предусматривает автокоррекцию вносимой информации. Прежде чем давать рекомендации по реализации требований целостности с помощью триггеров, рассмотрим более подробно свойства и структуру триггеров Microsoft SQL Server 2005 и средства работы с ними.

2.3. Понятие триггера. Классификация триггеров

Триггер в БД – это создаваемая для некоторой пользовательской таблицы хранимая процедура специального типа, которая запускается автоматически при осуществлении тех или иных модификаций в таблице. Пользовательская таблица, для которой создается триггер, называется связанной таблицей. А операция, которая инициирует выполнение триггера, называется активизирующей операцией. Так как операции над таблицами всегда (явно или неявно) ассоциированы с выполнением SQL-оператора или транзакции, в литературе чаще применяется другой термин – активизирующий оператор.

Какие именно действия приводят к запуску триггера? Полный их набор определяется версией СУБД, но чаще всего такими действиями являются вставка, удаление и обновление строк в связанной таблице. Что касается СУБД Microsoft SQL Server 2005, то здесь имеются две группы триггеров: DML (Data Manipulation Language – язык манипулирования данными) и DDL (Data Definition Language - язык определения данных). Они реагируют на выполнение операторов DML и DDL, соответственно. DML-триггеры в Microsoft SQL Server бывают трех типов:

·  inserttrigger – запускается при выполнении вставки строк в таблицу;

·  updatetrigger – запускается при обновлении значений в таблице;

·  deletetrigger – запускается при удалении строк из таблицы.

Необходимо еще раз подчеркнуть, что DML-триггеры всегда связаны с одной определенной таблицей и хранятся вместе с нею, в одной БД. Классификация DML-триггеров не является строгой, поскольку триггер может быть одновременно insert и update, update и delete и т. д. Не исключены случаи, когда для одного триггера все три оператора могут быть активизирующими.

Что касается DDL-триггеров, они охватывают всю группу операторов create/alter/drop, т. е. реагируют на создание, модификацию структуры и уничтожение различных объектов баз данных. Впрочем, и для операторов create/alter/drop database в СУБД SQL Server 2005 создать триггер.

Активизирующий оператор и триггер образуют единую транзакцию. Работа триггера, в конечном итоге, сводится либо к фиксации, либо к откату транзакции. Если выполняется откат, то отменяются и все действия, выполненные активизирующим оператором. При фиксации транзакции производится фиксирование изменений, выполненных как триггером, так и активизирующим оператором.

Второй тип классификации триггеров – по относительному моменту запуска:

·  триггер типа after – триггер, который запускается после активизирующего оператора (этот тип устанавливается при создании триггера по умолчанию);

·  триггер типа insteadof – триггер, выполняемый взамен активизирующего оператора.

Заметим, что DDL-триггер может относиться только к типу after.

В SQL Server 2005 разрешается создавать множество триггеров каждого типа для одной и той же таблицы. Кроме того, имеется возможность создавать триггеры для представлений.