CREATE RULE — создание нового правила перезаписи
CREATE [ OR REPLACE ] RULEnameAS ONсобытиеTOtable_name[ WHEREcondition] DO [ ALSO | INSTEAD ] { NOTHING |команда| (команда;команда... ) } гдесобытиеможет принимать одно из следующих значений: SELECT | INSERT | UPDATE | DELETE
CREATE RULE определяет новое правило для указанной таблицы или представления.
CREATE OR REPLACE RULE создает новое правило либо заменяет существующее правило с тем же именем для той же таблицы.
Система Digital Q.DataBase правил позволяет определить альтернативное действие, выполняемое при операциях вставки, обновления или удаления в таблицах базы данных. Проще говоря, правило вызывает выполнение дополнительных команд при выполнении заданной команды для определенной таблицы. Кроме того, правило INSTEAD
может заменить текущую команду другой или вовсе отменить ее выполнение. Правила также используются для реализации представлений (views) SQL. Важно понимать, что правило фактически представляет собой механизм преобразования команд или макрокоманду. Преобразование происходит до начала выполнения команды. Если вам требуется операция, которая должна срабатывать независимо для каждой физической строки, вероятно, следует использовать триггер, а не правило. Дополнительная информация о системе правил приведена в Глава 5.4.
В настоящее время 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Имя создаваемого правила. Оно должно отличаться от имен других правил для этой же таблицы. Несколько правил для одной таблицы и одного типа события применяются в алфавитном порядке их имен.
событие
Событие — это одно из SELECT,
INSERT, UPDATE, или
DELETE. Обратите внимание, что
INSERT содержащая ON
CONFLICT предложение не может быть использовано для таблиц, имеющих
либо INSERT или UPDATE
правила. Вместо этого рассмотрите возможность использования обновляемого представления.
table_nameИмя (возможно, дополненное схемой) таблицы или представления, к которому применяется правило.
condition
Любое SQL условное выражение (возвращающее
boolean). Выражение условия не может ссылаться на какие-либо таблицы, кроме NEW и OLD, и
не могут содержать агрегатные функции.
INSTEADINSTEAD указывает на то, что команды должны быть
выполнены вместо исходной команды.
ALSOALSO указывает на то, что команды должны быть
выполнены в дополнение к исходной
команде.
Если ни ALSO ни
INSTEAD не указано, ALSO
используется по умолчанию.
команда
Команда или команды, составляющие действие правила. Допустимыми
командами являются SELECT,
INSERT, UPDATE,
DELETE, или NOTIFY.
Внутри condition и
команда, специальные
имена таблиц 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 соответствующего предложения.
Очень важно избегать цикличных правил. Например, хотя оба следующих определения правил будут приняты Digital Q.DataBase, команда
SELECT приведет к тому, что
Digital Q.DataBase выдаст ошибку из-за рекурсивного развертывания правила:
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 является
Digital Q.DataBase расширением языка, как и вся система перезаписи запросов.