CREATE RULE#

CREATE RULE

CREATE RULE

CREATE RULE — определить новое правило перезаписи

Синтаксис

CREATE [ OR REPLACE ] RULE name AS ON event
    TO table_name [ WHERE condition ]
    DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }

where event 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, также как и весь система переписывания запросов.

См. также

ALTER RULE, DROP RULE