×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

6.1.77. CREATE RULE

6.1.77. CREATE RULE

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

Синтаксис

CREATE [ OR REPLACE ] RULE name AS ON событие
    TO table_name [ WHERE condition ]
    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, и не могут содержать агрегатные функции.

INSTEAD

INSTEAD указывает на то, что команды должны быть выполнены вместо исходной команды.

ALSO

ALSO указывает на то, что команды должны быть выполнены в дополнение к исходной команде.

Если ни 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 расширением языка, как и вся система перезаписи запросов.

См. также

ALTER RULE, DROP RULE
Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению