Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Зеркалирование
Управление ресурсами
Безопасность
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Потоковая передача
Восстановление после сбоев
Конфигурация
Индексы
Расширения
Справочник по SQL
Часто задаваемые вопросы
Определяет новый триггер. Пользовательские триггеры не поддерживаются в Database.
CREATE TRIGGER <name> {BEFORE | AFTER} {<event> [OR ...]}
ON <table> [ FOR [EACH] {ROW | STATEMENT} ]
EXECUTE PROCEDURE <funcname> ( <arguments> )
CREATE TRIGGER создаёт новый триггер. Триггер будет связан с указанной таблицей и будет запускать указанную функцию при наступлении определённых событий. Если для одного и того же события определено несколько триггеров одного типа, они будут выполняться в алфавитном порядке по имени.
Важно: из-за распределённой природы системы баз данных использование триггеров для данных крайне ограничено в Database. Функция, используемая в триггере, должна быть IMMUTABLE (неизменяемой), то есть она не может использовать информацию, отсутствующую непосредственно в списке её аргументов. Также указанная в триггере функция не может выполнять никакие SQL-запросы и изменять распределённые объекты базы данных никаким образом. Поскольку триггеры чаще всего используются для изменения таблиц (например, обновления других строк при обновлении текущей строки), данные ограничения делают применение триггеров в Database практически бесполезным. По этой причине Database не поддерживает использование пользовательских триггеров. Триггеры нельзя использовать с таблицами с режимом добавления записей (append-optimized). В Database поддерживаются Event Triggers (триггеры событий), которые перехватывают только DDL-события. Дополнительную информацию см. в документации PostgreSQL по Event Triggers.
SELECT не изменяет строки, поэтому создание SELECT-триггеров невозможно. В таких случаях более уместно использовать правила или представления.
INSERT, UPDATE или DELETE). Несколько событий можно указать через OR.Для создания триггера на таблице пользователь должен обладать привилегией TRIGGER на эту таблицу.
Объявление функции триггера и самого триггера:
CREATE FUNCTION sendmail() RETURNS trigger AS
'$GPHOME/lib/emailtrig.so' LANGUAGE C IMMUTABLE;
CREATE TRIGGER t_sendmail AFTER INSERT OR UPDATE OR DELETE
ON mytable FOR EACH STATEMENT EXECUTE PROCEDURE sendmail();
Инструкция CREATE TRIGGER в Database реализует лишь подмножество стандарта SQL. Следующие возможности в настоящее время отсутствуют:
Database накладывает строгие ограничения на функцию, вызываемую триггером, что сильно ограничивает практическое применение триггеров. По этой причине триггеры официально не поддерживаются в Database.
SQL позволяет триггерам срабатывать при обновлении конкретных столбцов (например, AFTER UPDATE OF col1, col2).
SQL позволяет определять псевдонимы для старых ('old') и новых ('new') строк или таблиц для использования в действии триггера (например, CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...). Поскольку Database позволяет писать процедуры триггеров на различных пользовательских языках, доступ к данным осуществляется специфичным для языка способом.
Database разрешает выполнение только пользовательской функции в качестве действия триггера. Стандарт SQL допускает выполнение ряда других SQL-команд, например CREATE TABLE, в качестве действия триггера. Это ограничение легко обходится путём создания пользовательской функции, выполняющей нужные команды.
Согласно стандарту SQL, несколько триггеров должны срабатывать в порядке их создания. Database использует порядок по имени, который был признан более удобным.
Стандарт SQL предусматривает, что триггеры BEFORE DELETE, установленные на каскадное удаление, срабатывают после завершения каскадного DELETE. В Database поведение таково, что BEFORE DELETE всегда срабатывает до операции удаления, даже если она каскадная. Это считается более согласованным подходом.
Возможность указания нескольких действий для одного триггера с помощью OR является расширением Database по отношению к стандарту SQL.