
- •Работа с субд PostgreSql
- •Работа с субд PostgreSql
- •Введение
- •1Установка PostgreSql
- •2Создание новой бд
- •2.1Создание новой бд
- •2.2Создание новой таблицы
- •2.3Создание связей между таблицами
- •3Создание индексов
- •4Доступ к PostgreSql из Java
- •4.1Соединение с PostgreSql
- •4.2Взаимодействие с бд
- •5Создание представлений
- •6Хранимые процедуры и Триггеры
- •6.1Хранимые процедуры
- •6.1.1Оператор Create Function языка pl/pgSql
- •6.1.2Создание хранимых процедур в pgAdmin III
- •6.1.3Вызов хранимых процедур в Java
- •6.2Триггеры бд
- •6.2.1Синтаксис определения триггера в PostgreSql
- •6.2.2Создание триггера в PgAdmin III
- •7Права доступа
- •Создание ролей;
- •7.1Создание ролей
- •7.2Назначение прав доступа
- •7.3Отмена прав доступа
- •7.4Проверка прав доступа
- •8Резервное копирование и восстановление бд
- •8.1Резервное копирование (BackUp) бд
- •8.2Восстановление (Restore) бд
- •8.3Создание sql-дампа бд
- •8.4Восстановление sql-дампа бд
- •8.5Восстановление sql-дампа средствами pgAdmin III
- •9Особенности взаимодействия субд access и PostgreSql
- •9.1Подготовка соединения PostgreSql с бд в Access
- •9.2Копирование таблиц Access в таблицы PostgreSql
- •9.3Подключение таблиц PostgreSql к бд в Access
- •10Администрирование PostgreSql
- •Литература
6.2Триггеры бд
Триггер БД – это процедура, которая хранится в виде объекта БД и выполнение которой неявно инициируется при наступлении определенных событий. Как правило, такими событиями являются изменения в состоянии БД, которые инициируются предложениями INSERT, UPDATE, DELETE.
Следует отметить, что триггер в PostgreSQL – это связь триггерной функции с одной (или несколькими) из операций модификации, выполняемых над таблицей (UPDATE, INSERT, DELETE), автоматически запускающая эту функцию при получении соответствующего запроса. То есть, с каждым триггером должна быть связана триггерная функция.
В PostgreSQL Триггерная функция отличается от функции тем, что тип ее результата – trigger.
6.2.1Синтаксис определения триггера в PostgreSql
Синтаксис определения триггера в PostgreSQL следующий:
CREATE TRIGGER имя_триггера время_инициирования_триггера
событие_триггера ON имя_таблицы
уровень_триггера
EXECUTE ROCEDURE заголовок_триггерной_функции;
Имя триггера. Имя триггера должно быть уникальным среди имен триггеров схемы БД.
Время инициирования триггера. При определении триггера предоставляется возможность указать момент инициирования его выполнения, а именно – должен ли триггер быть инициирован перед выполнением события (фраза BEFORE) или после (фраза AFTER).
Событие триггера. В качестве событий триггера могут выступать только изменения состояний БД. Они, естественно, связаны с командами вставки, изменения и удаления строк таблицы.
Имя таблицы. Имя таблицы БД, причем только одной.
Уровень триггера. Уровень триггера определяется одной из следующих фраз: FOR EACH ROW или FOR EACH STATEMENT. Тем самым можно указать, сколько раз триггер будет выполняться по отношению к инициирующему его событию. Возможны два варианта:
По одному разу относительно каждой строки, которая будет подвергнута воздействию события триггера (фраза FOR EACH ROW);
Один раз относительно события независимо от того, сколько строк он обрабатывает (фраза FOR EACH STATEMENT).
Заголовок триггерной функции. Указывается триггерная функция, которая будет выполняться при инициализации триггера.
Во время работы триггера доступны специальные переменные: OLD (запись перед обновлением или перед удалением), NEW (запись, которая будет вставлена или обновлена). Более наглядно использование этих переменных приведено в таблице 6.1.
Таблица 6.1 – Использование переменных OLD и NEW
Событие |
Переменная |
UPDATE |
OLD, NEW |
INSERT |
NEW |
DELETE |
OLD |
6.2.2Создание триггера в PgAdmin III
Рассмотрим процесс создания триггера в pgAdmin III на конкретном примере.
Пример 1: При добавлении записи в таблицу Marks БД «Деканат ВУЗа» необходимо автоматически пересчитывать средний балл студента (колонка SrBall в таблице Students).
Первоначально необходимо написать триггерную функцию, которая будет подсчитывать средний балл студента по таблице Marks и обновлять соответствующую запись в таблице Students. Для этого в окне Браузер объектов для БД «Деканат ВУЗа» необходимо выделить раздел Триггерные функции и активизировать соответствующее контекстное меню (рисунок 6.5).
Рисунок 6.5 – Контекстное меню раздела Триггерные функции
В результате откроется окно создания новой триггерной функции (рисунок 6.6).
Рисунок 6.6 – Окно Новая триггерная функция. Закладка Свойства
На закладке Свойства необходимо указать следующие параметры:
Имя – имя триггерной функции (для примера update_SrBall), должно быть уникальным среди имен триггерных функций схемы БД;
Владелец – postgres;
Язык – процедурный язык (plpgsql);
Временность – VOLATILE [7] указывает на то, что значение функции может изменяться в пределах одного сканирования таблицы (используется по умолчанию);
На закладке Определение вводится "тело" функции (рисунок 6.7):
Рисунок 6.7 – Закладка Определение окна Новая триггерная функция
Полный код функции можно просмотреть на закладке SQL (рисунок 6.8).
Рисунок 6.8 – Закладка SQL окна Новая триггерная функция
После этого необходимо создать триггер. Для этого в окне Браузере объектов нужно выбрать таблицу Marks, активизировать ее контекстное меню и в нем выбрать пункт Новый триггер (рисунок 6.9).
Рисунок 6.9 – Контекстное меню раздела Триггеры
В результате открывается окно создания нового триггера (рисунок 6.10).
Рисунок 6.10 – Окно Новый триггер. Закладка Свойства
В свойствах нового триггера необходимо указать следующее:
Имя – имя нового триггера;
свойство Строчный триггер задает уровень триггера: FOR EACH ROW (свойство выбрано) или FOR EACH STATEMENT (свойство не выбрано).
Триггерная функция – функция, которая будет выполняться при срабатывании триггера (выбирается из выпадающего списка);
свойство Срабатывает указывает момент инициирования триггера, а именно – должен ли триггер быть инициирован перед выполнением события (BEFORE) или после (AFTER);
События – указывается событие, по которому инициируется триггер. Важно подчеркнуть, что для одного триггера можно выбрать как одно событие, так и несколько.
Проверить работу триггера можно при добавлении новой записи в таблицу Marks (рисунок 6.11). Автоматически будет изменено значение колонки SrBall таблицы Students для заданного студента (рисунок 6.12).
Рисунок 6.11 – Содержимое таблицы Marks
Рисунок 6.12 – Содержимое таблицы Students