
- •Лабораторная работа № 3 Использование диаграмм для графического представления структуры базы данных
- •Теоретическое обоснование
- •Методика и порядок выполнения работы Методика и порядок выполнения задания 1
- •Методика и порядок выполнения задания 2
- •Содержание отчета и его форма
- •Методика и порядок выполнения работы
- •Select ...
- •Методика и порядок выполнения работы
- •Контрольные вопросы
- •Лабораторная работа № 7 Использование ограничений в sql – совместимых базах данных
- •Теоретическое обоснование
- •Контрольные вопросы
- •Лабораторная работа № 8 Хранимые процедуры в sql Server
- •Теоретическое обоснование
- •Задания к лабораторной работе № 7
- •Контрольные вопросы
- •Лабораторная работа № 9 Триггеры в sql Server
- •Использование триггеров
- •Срабатывание триггеров
- •Создание триггеров
- •Удаление триггеров
- •Таблицы deleted и inserted
- •Просмотр таблиц deleted и inserted
- •Вставка и удаление нескольких записей
- •Триггер вставки
- •Условный триггер вставки
- •Триггер обновления
- •Задание к лабораторной работе № 9
- •Методика и порядок выполнения работы Методика и порядок выполнения задания 1
- •Методика и порядок выполнения задания 2
- •Содержание отчета и его форма
- •Контрольные вопросы и защита работы
- •Лабораторная работа № 11
- •Обеспечение безопасности пользователей в sql Server
- •Цель и содержание:изучить основные приемы администрирования баз данных вSqlServer, рассмотреть возможность добавления новых пользователей в систему и разграничения их полномочий.
- •Теоретическое обоснование
- •Методика и порядок выполнения работы Методика и порядок выполнения задания 1
- •Методика и порядок выполнения задания 2
- •Методика и порядок выполнения задания 3
- •Содержание отчета и его форма
- •Методика и порядок выполнения работы Методика и порядок выполнения задания 1
- •Методика и порядок выполнения задания 2
- •Методика и порядок выполнения задания 3
- •Содержание отчета и его форма
- •Контрольные вопросы
- •Лабораторная работа № 14 Организация обмена данными. Взаимодействие sql-сервера с Word и Excel
- •Контрольные вопросы
- •Лабораторная работа № 15 Организация обмена данными. Взаимодействие sql-сервера и локальных баз данных Access и FoxPro
- •Взаимодействие sql-сервера и Visual FoxPro
- •Контрольные вопросы
Таблицы deleted и inserted
Таблицы deleted и inserted являются специальными представлениями журнала транзакций, доступными лишь во время срабатывания триггера и в пределах триггера. В этих таблицах отражаются изменения, внесенные в таблицу командой, которая привела к срабатыванию триггера.
Структуры таблиц inserted и deleted в точности совпадают со структурой таблицы, для которой создавался триггер. Таблица inserted содержит новые записи, созданные командой INSERT или UPDATE. Таблица deleted содержит записи, удаленные вследствие выполнения DELETE или UPDATE.
SQL Server обычно интерпретирует команду UPDETE как DELETE с последующей INSERT. Вставляемые и удаляемые записи включаются в таблицы inserted и deleted. Эти таблицы могут использоваться только внутри триггеров для определения того, какое событие вызвало срабатывание триггера. Записи таблицы inserted создаются при вставке или обновлении, а записи таблицы deleted — при удалении или обновлении. Нередко триггер включает таблицы inserted и deleted в объединение для обеспечения ссылочной целостности и целостности внешних ключей.
Просмотр таблиц deleted и inserted
В этом разделе приведен пример использования таблиц inserted и deleted. Мы напишем триггер обновления для таблицы publishers, выполняющий каскадное удаление в таблице titles.
Не забывайте о проверке количества записей, участвующих в операции (через @@ROWCOUNT), поскольку команда DELETE заставляет триггер сработать ровно один раз, независимо от того, удаляла она записи или нет. Следующий триггер производит каскадное удаление подчиненных записей.
Листинг 1. Триггер каскадного удаления
CREATE TRIGGER cascade_del_trigger
ON publisher FOR DELETE
AS
IF @@ROWCOUNT = 0 -- Удаленных записей нет
RETURN
/* Каскадное удаление записей из таблицы titles, */
/* связанных по полю pub_id */
DELETE titles
FROM titles t, deleted d
WHERE t.pub_id = d.pub_id
IF @@ERROR != 0
BEGIN
PRINT 'Error occurred during related tables' ROLLBACK TRAN
END
RETURN
Структура таблиц deleted и inserted идентична структуре базовой таблицы.
Вставка и удаление нескольких записей
SQL Server позволяет вставить несколько записей в одной команде INSERT с помощью конструкции INSERT...SELECT. Если в процессе вставки или обновления участвуют несколько значений внешнего ключа, триггер должен сравнить количество вставленных или обновленных записей с количеством записей, являющихся допустимыми ключами. Такое сравнение проверяет, что для модифицированных записей имеются соответствующие ключи.
Для проверки ссылочной целостности можно воспользоваться агрегатной функцией COUNT(*) для соединения таблицы inserted с таблицей первичного ключа. Например, в начале триггера можно сравнить SELECT COUNT(*) со значением @@ROWCOUNT. Значение @@ROWCOUNT необходимо проверить (а лучше сохранить в локальной переменной) до выполнения в триггере каких-либо операций, способных повлиять на @@ROWCOUNT. Дело в том, что любая команда SQL приводит к изменению @@ROWCOUNT (в том числе и та, которая проверяет @@ROWCOUNT).
Следующий фрагмент программы демонстрирует методику проверки ссылочной целостности в триггере:
CREATE TRIGGER tr1
ON...
FOR INSERT, UPDATE
AS
DECLARE @ROWS INT
SELECT @rows = @@ROWCOUNT
…
IF (SELECT COUNT(*) FROM inserted i, pkey_tab p
WHERE i.fkey = p.pkey) != @rows
/* По крайней мере одна из вставленных/удаляемых записей
** не совпадает с первичным ключом */
/* Начать обработку ошибок */
...Проверка столбцов при модификации
Выполняемая в таблице команда INSERT или UPDATE приводит к срабатыванию триггера вставки пли обновления. Если триггер проектировался для обеспечения ссылочной целостности, возможно, вас интересует лишь обновление или вставка в столбцах первичного или внешнего ключа. Конструкция IF UPDATE позволяет определить, выполнялась ли вставка или модификация для конкретного столбца. Синтаксис IF UPDATE выглядит следующим образом:
IF UPDATE (имя_столбца)
[ { AND | OR } UPDATE (,имя_ст6лбца).. ,]
Результат проверки IF UPDATE равен TRUE в случае истинности одного из следующих условий:
• В столбец было вставлено значение, отличное от NULL.
• Столбец был включен в секцию SET команды UPDATE.
Функция COLUMNS_UPDATE() позволяет узнать, входил ли конкретный столбец в команду INSERT или UPDATE. Оператор COLUMNS_UPDATE() имеет следующий синтаксис:
IF (COLUMNS_UPDATE() {поразрядный_оператор} маска_обновления)
{оператор_сравнения} маска_столбцов ]
Проверка может выполняться в триггерах вставки или обновления; с ее помощью можно узнать о факте обновления нескольких столбцов. Параметры имеют следующий смысл:
Поразрядный_оператор — определяет оператор, используемый при сравнении.
Маска_обновления — определяет обновляемые столбцы.
Маска _столбцов — определяет проверяемые столбцы.
Оператор_сравнения — определяет оператор, используемый для проверки столбцов:
= означает, что все столбцы маски должны обновляться.
> означает, что не все столбцы маски должны обновляться.