CREATE RULE

Определяет новые правила перезаписи.

Обзор

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

Описание

CREATE RULE определяет новые правила, применяемые к указанной таблице или представлению. CREATE OR REPLACE RULE создаёт новое правило или заменяет существующее правило с тем же именем для той же таблицы.

Система правил YMatrix позволяет определить дополнительную операцию, которая выполняется при вставке, обновлении или удалении данных в таблицах базы данных. Когда выполняется заданная команда над указанной таблицей, правило приводит к выполнению дополнительных или альтернативных команд. Правило INSTEAD может заменить заданную команду другой командой или вообще предотвратить выполнение исходной команды. Правила также могут использоваться для реализации SQL-представлений. Важно понимать, что правила на самом деле являются механизмами преобразования команд или макросами команд. Преобразование происходит до начала выполнения команды. Оно не выполняется отдельно для каждой физической строки, как триггер.

Правило ON SELECT должно быть безусловным правилом INSTEAD и содержать операцию, состоящую из одной команды SELECT. Таким образом, правило ON SELECT фактически превращает таблицу в представление, и её видимое содержимое — это строки, возвращаемые командой SELECT правила, а не данные, хранящиеся в самой таблице (если таковые имеются). Использование команды CREATE VIEW считается более правильным подходом, чем создание реальной таблицы с определением правила ON SELECT для неё.

Вы можете создать иллюзию возможности обновления представлений, определив правила ON INSERT, ON UPDATE и ON DELETE, которые заменяют операции обновления над представлением соответствующими операциями над другими таблицами. Если вы хотите поддерживать конструкции вроде INSERT RETURNING и т.п., убедитесь, что каждое правило содержит соответствующее предложение RETURNING.

Если вы пытаетесь использовать условные правила для обновления представлений, существует ловушка: чтобы разрешить все операции над представлением, вы должны иметь безусловное правило INSTEAD. Если правило является условным или не имеет модификатора INSTEAD, система всё равно будет отклонять попытки выполнения операций обновления, поскольку считает, что в некоторых случаях может потребоваться выполнить операцию над виртуальной таблицей представления. Если вы хотите охватить все полезные случаи в условных правилах, добавьте безусловное правило DO INSTEAD NOTHING, чтобы гарантировать, что система поймёт: она никогда не будет вызвана для обновления виртуальной таблицы. Затем установите условные правила как не-INSTEAD; если они будут применены, они просто добавятся к операции по умолчанию INSTEAD NOTHING. (Однако этот метод в настоящее время не применим для поддержки запросов с RETURNING.)

Параметры

name

  • Имя создаваемого правила. Это имя должно отличаться от имени любого другого правила той же таблицы. Несколько правил для одной таблицы одного и того же типа события применяются в алфавитном порядке имён.

event

  • Одно из событий: SELECT, INSERT, UPDATE или DELETE.

table_name

  • Имя таблицы или представления, к которому применяется правило (может указываться с указанием схемы).

condition

  • Любое условное выражение SQL (возвращает булево значение). Условные выражения не могут ссылаться ни на какие таблицы, кроме NEW и OLD, и не могут содержать агрегатные функции. NEW и OLD ссылаются на значения в целевой таблице. NEW допустим в правилах ON INSERT и ON UPDATE для ссылки на новые строки, которые будут вставлены или обновлены. OLD допустим в правилах ON UPDATE и ON DELETE для ссылки на существующие строки, которые будут обновлены или удалены.

INSTEAD

  • INSTEAD NOTHING указывает команду, которая будет выполнена вместо исходной команды.

ALSO

  • ALSO указывает, что команды должны выполняться дополнительно к исходной команде. Если ни ALSO, ни INSTEAD не указаны, используется значение по умолчанию — ALSO.

Command

  • Одна или несколько команд, составляющих операции правила. Допустимыми командами являются SELECT, INSERT, UPDATE или DELETE. Специальные имена таблиц NEW и OLD можно использовать для ссылки на значения в целевых таблицах. NEW допустим в правилах ON INSERT и ON UPDATE для ссылки на новые строки, которые будут вставлены или обновлены. OLD допустим в правилах ON UPDATE и ON DELETE для ссылки на существующие строки, которые будут обновлены или удалены.

Примечание

Вы должны быть владельцем таблицы, чтобы создавать или изменять правила для этой таблицы.

Особое внимание следует уделять предотвращению зацикливания правил. Рекурсивные правила не проверяются во время создания, но при их выполнении будет выдана ошибка.

Пример

Создайте правило, которое при попытке пользователя вставить строки в родительскую таблицу rank секционированной таблицы, будет вставлять строки в дочернюю таблицу b2001:

CREATE RULE b2001 AS ON INSERT TO rank WHERE gender='M' and
year='2001' DO INSTEAD INSERT INTO b2001 VALUES (NEW.id,
NEW.rank, NEW.year, NEW.gender, NEW.count);

Совместимость

CREATE RULE является расширением языка YMatrix, как и вся система перезаписи запросов.

Смотрите также

ALTER RULE , DROP RULE