CREATE RULE#
CREATE RULE
CREATE RULE — определить новое правило перезаписи
Синтаксис
CREATE [ OR REPLACE ] RULEname
AS ONevent
TOtable_name
[ WHEREcondition
] DO [ ALSO | INSTEAD ] { NOTHING |command
| (command
;command
... ) } whereevent
can be one of: SELECT | INSERT | UPDATE | DELETE
Описание
CREATE RULE
определяет новое правило, применяемое к указанной таблице или представлению.
CREATE OR REPLACE RULE
создаст новое правило или заменит существующее правило с тем же именем для той же таблицы.
Система правил Tantor BE позволяет определить альтернативное действие, которое будет выполняться при вставке, обновлении или удалении в таблицах базы данных. Грубо говоря, правило вызывает выполнение дополнительных команд при выполнении определенной команды на определенной таблице. В качестве альтернативы, правило INSTEAD
может заменить данную команду другой или вызвать отказ от выполнения команды вообще. Правила также используются для реализации SQL-представлений. Важно понимать, что правило на самом деле является механизмом преобразования команды или командной макросом. Преобразование происходит перед началом выполнения команды. Если вам действительно нужна операция, которая выполняется независимо для каждой физической строки, вероятно, вам следует использовать триггер, а не правило. Более подробную информацию о системе правил можно найти в разделе Глава 38.
В настоящее время правила ON SELECT
могут быть прикреплены
только к представлениям. Такое правило должно называться "_RETURN"
,
должно быть безусловным правилом INSTEAD
и должно иметь
действие, состоящее из одной команды SELECT
.
Эта команда определяет видимое содержимое представления. (Само представление
по сути является фиктивной таблицей без хранения данных.) Лучше всего
рассматривать такое правило как деталь реализации. Хотя представление можно
переопределить с помощью CREATE OR REPLACE RULE "_RETURN" AS
...
, лучше использовать CREATE OR REPLACE
VIEW
.
Вы можете создать иллюзию обновляемого представления, определив правила ON INSERT
, ON UPDATE
и ON DELETE
(или любое их подмножество, достаточное для ваших целей), чтобы заменить действия обновления в представлении соответствующими обновлениями в других таблицах. Если нужно поддерживать INSERT RETURNING
и так далее, убедитесь, что в каждом из этих правил есть подходящее предложение RETURNING
.
Есть одна особенность, если вы пытаетесь использовать условные правила для обновления сложного представления: для каждого действия, которое нужно разрешить на представлении, должно быть безусловное правило INSTEAD
. Если правило является условным или не является INSTEAD
, то система все равно будет отклонять попытки выполнить действие обновления, потому что она думает, что в некоторых случаях может попытаться выполнить действие на фиктивной таблице представления. Если нужно обрабатывать все полезные случаи в условных правилах, добавьте безусловное правило DO INSTEAD NOTHING
, чтобы убедить систему в том, что ее никогда не попросят обновить фиктивную таблицу. Затем сделайте условные правила не-INSTEAD
; в случаях, когда они применяются, они добавляются к действию по умолчанию INSTEAD NOTHING
. (Однако этот метод в настоящее время не работает для поддержки запросов RETURNING
).
Примечание
Представление, достаточно простое для автоматического обновления (см. CREATE VIEW), не требует создания пользователем правила для возможности обновления. Хотя вы можете создать явное правило в любом случае, автоматическое преобразование обновления обычно будет работать быстрее явного правила.
Другой альтернативой, которую стоит рассмотреть, является использование триггеров INSTEAD OF
(см. CREATE TRIGGER) вместо правил.
Параметры
name
Имя правила для создания. Оно должно отличаться от имени любого другого правила для той же таблицы. Несколько правил для одной и той же таблицы и типа события применяются в алфавитном порядке имен.
event
Событие можно записать одним из следующих способов
SELECT
,INSERT
,UPDATE
илиDELETE
. Обратите внимание, чтоINSERT
сON CONFLICT
не может использоваться для таблиц, на которых есть правилаINSERT
илиUPDATE
. Рассмотрите возможность использования обновляемого представления вместо этого.table_name
Имя (опционально с указанием схемы) таблицы или представления, к которым применяется правило.
condition
Любое условное выражение SQL (возвращающее
boolean
). Условное выражение не может ссылаться на какие-либо таблицы, кромеNEW
иOLD
, и не может содержать агрегатные функции.INSTEAD
INSTEAD
указывает, что команды должны быть выполнены вместо исходной команды.ALSO
ALSO
указывает, что команды должны быть выполнены в дополнение к исходной команде.Если не указано ни
ALSO
, ниINSTEAD
, по умолчанию используетсяALSO
.command
Команда или команды, составляющие действие правила. Допустимые команды:
SELECT
,INSERT
,UPDATE
,DELETE
илиNOTIFY
.
Внутри condition
и command
можно использовать специальные имена таблиц NEW
и OLD
для ссылки на значения в соответствующей таблице. NEW
допустимо использовать в правилах ON INSERT
и ON UPDATE
для ссылки на новую вставляемую или обновляемую строку. OLD
допустимо использовать в правилах ON UPDATE
и ON DELETE
для ссылки на существующую обновляемую или удаляемую строку.
Примечания
Вы должны быть владельцем таблицы, чтобы создавать или изменять правила для нее.
В правиле для INSERT
, UPDATE
или DELETE
на представлении вы можете добавить предложение RETURNING
, которое возвращает столбцы представления. Это предложение будет использоваться для вычисления результатов, если правило вызывается командой INSERT RETURNING
, UPDATE RETURNING
или DELETE RETURNING
соответственно. Когда правило вызывается командой без RETURNING
, предложение RETURNING
в правиле будет проигнорировано. В текущей реализации только безусловные правила INSTEAD
могут содержать RETURNING
; кроме того, среди всех правил для одного и того же события может быть не более одного предложения RETURNING
. (Это гарантирует, что есть только одно предложение RETURNING
, которое может быть использовано для вычисления результатов). Запросы RETURNING
на представление будут отклонены, если в доступном правиле нет предложения RETURNING
.
Очень важно следить, чтобы избежать циклических правил. Например, хотя оба следующих определения правил принимаются Tantor BE, команда SELECT
вызовет ошибку в Tantor BE из-за рекурсивного разворачивания правила:
CREATE RULE "_RETURN" AS ON SELECT TO t1 DO INSTEAD SELECT * FROM t2; CREATE RULE "_RETURN" AS ON SELECT TO t2 DO INSTEAD SELECT * FROM t1; SELECT * FROM t1;
В настоящее время, если действие правила содержит команду NOTIFY
,
команда NOTIFY
будет выполнена безусловно, то есть
NOTIFY
будет выпущена даже если нет строк, к которым
должно применяться правило. Например, в:
CREATE RULE notify_me AS ON UPDATE TO mytable DO ALSO NOTIFY mytable; UPDATE mytable SET name = 'foo' WHERE id = 42;
Одно событие NOTIFY
будет отправлено во время
UPDATE
, независимо от того, есть ли строки, которые
соответствуют условию id = 42
. Это ограничение реализации,
которое может быть исправлено в будущих версиях.
Совместимость
CREATE RULE
- это расширение языка Tantor BE, также как и весь система переписывания запросов.