2. Cоздайте и протестируйте триггер INSERT для таблицы Orders
3. Cоздайте и протестируйте триггер DELETE для таблицы Orders.
Cоздайте и протестируйте триггер UPDATE для таблицы Products.
Cоздайте и протестируйте триггер UPDATE для запрещения обновления какого-либо столбца таблицы.
Используйте триггер INSTEAD OF для обновления таблицы.
7. Создайте и протестируйте триггер DDL, который предотвратит удаление или изменение таблицы в базе данных Sales.
Cохраните БД для дальнейшей работы
Описание работы
Что такое триггеры
Триггер представляет собой набор инструкций SQL Server, которая выглядит и действует подобно хранимой процедуре. Единственное реальное отличие состоит в том, что триггер нельзя вызвать с помощью команды EXEC. Триггеры активизируются при выполнении пользователем определенной инструкции Transact-SQL. Триггеры DML запускаются с помощью инструкций INSERT, UPDATE или DELETE, а триггеры DDL— с помощью инструкций CREATE, ALTER и/или DROP.
Предположим, в таблице клиентов вы определили триггер INSERT, указывающий, что пользователи не могут добавлять записи о новых клиентах, находящихся за пределами США. Как только пользователь попытается добавить новую запись, будет запущен триггер INSERT, который определит, соответствует ли она данному критерию. В случае соответствия запись вставляется в таблицу; в противном случае этого не происходит.
SQL Server может блокировать модификацию данных, если запись не соответствует критериям, поскольку триггеры рассматриваются как транзакции. Транзакцией называется блок инструкций Transact-SQL, который интерпретируется SQL Server как единое целое. Код группируется в транзакцию путем помещения инструкции BEGIN TRAN в начало кода и инструкции COMMIT в его конец. Эти инструкции могут размещаться как пользователем (явная транзакция), так и SQL Server (неявная транзакция). Поскольку триггер рассматривается как транзакция, вам нужно добавить лишь команду ROLLBACK в соответствующее место в коде. Команда ROLLBACK указывает серверу остановить обработку модификации и запретить транзакцию.
С помощью команды RAISEERROR () вы можете отправить сообщение об ошибке пользователю, который пытается нарушить правило триггера. Вы даже можете сообщить ему, что собираетесь отправить докладную управляющему.
В этом смысле триггеры работают подобно сторожевым псам базы данных, ожидая, когда пользователь попытается модифицировать данные, а затем включаются в действие и защищают бизнес-логику.
Существуют и другие способы реализации бизнес-логики. Используя связь внешнего ключа между таблицами клиентов и заказов, вы можете запретить удаление подвешенного заказа пользователями. Вы также можете не позволить пользователю вставлять заказ для клиента отсутствующего в таблице клиентов. То же относится и к полномочиям удаления и обновления— действие нельзя будет выполнить в случае отмены полномочий. Если же подтвердить все полномочия, то пользователи смогут выполнять все действия.
Эти методы удобно использовать для внедрения бизнес-логики, такой как «в отделе маркетинга нельзя удалять данные, а только вставлять» или «записи клиентов с "висящими” заказами нельзя удалять». Большинство компаний используют гораздо более сложную бизнес-логику. Они могут, к примеру, регламентировать правило бизнеса, гласящее следующее: «без разрешения менеджера нельзя устанавливать лимит кредитования клиентам больше 10 000 долларов или пользователь не может удалить данные о клиенте с кредитом больше 10 000 долларов». Это довольно распространенные правила бизнеса, которые нельзя внедрить в таблице с помощью связей внешнего ключа или полномочий. Такую сложную деловую логику можно реализовать только с помощью триггеров. Мы начнем рассмотрение с триггеров на вставку (INSERT).