2016-12-27 3 views
0

В правилах postgres (https://www.postgresql.org/docs/current/static/sql-createrule.html) можно ли использовать переменные? Например, если в правиле яИспользование переменных в правиле postgres

CREATE RULE "_RETURN" AS 
    ON INSERT TO t1 
    DO INSTEAD 
     INSERT INTO t1 (id, a) VALUES (uuid_generate_v4(), new.a) 
     INSERT INTO t4 (id) VALUES (??????) 

Может ли я какой-то образом установить значение uuid_generate_v4() в первой ВСТАВКЕ как переменные, так что я могу использовать его во втором INSERT? Или есть способ получить идентификатор генерации из первого INSERT, чтобы его можно было использовать во втором?

Также я получаю сообщение об ошибке infinite recursion detected in rules for relation. Вероятно, потому что правило для таблицы t1, но оно содержит инструкцию для вставки в t1. Как я могу сделать эту работу?

+0

Я думаю, вы могли бы использовать [CTE] (https://www.postgresql.org/docs/9.1/static/queries-with.html), чтобы выбрать значение uuid и ссылку на него во вставке, хотя есть, вероятно, и другие способы. Кроме того, ваша рекурсия, скорее всего, связана с тем, что на каждой вставке в 't1' вы создаете правило, которое выполняет вставку в' t1', снова запускающее правило. – jcern

ответ

0

Также я получаю ошибку: бесконечная рекурсия обнаружена в правилах для отношения . Вероятно, потому что правило для таблицы t1, но оно содержит инструкцию для вставки в t1. Как я могу сделать эту работу

Не может работать.
См документация: 39.4. Rules on INSERT, UPDATE, and DELETE

запрос дерева, полученные от действий правила снова брошены в систему переписывания, и, возможно, больше правил получить применяются в результате более или менее дерев запросов. Таким образом, действия правила должны иметь либо тип команды , либо другое отношение результата, чем правило , но в противном случае этот рекурсивный процесс завершится бесконечным циклом . (Рекурсивный расширение правила будут обнаружены и сообщается как ошибка.)

Другими словами, в правиле ON INSERT TO t1 вы не можете стрелять другой insert к той же таблице t1, потому что эта причина, что правило будет рекурсивно запускаться снова и снова - и это вызовет ошибку.

Вам нужно использовать триггер для этой задачи.

+0

Правило рекурсии в сторону, линия INSERT INTO t1 (идентификатор, а) VALUES (uuid_generate_v4(), new.a) должен быть INSERT INTO t1 (идентификатор, а) VALUES (uuid_generate_v4(), new.a) возвращение идентификатор , чтобы получить значение uuid_generate_v4 –

 Смежные вопросы

  • Нет связанных вопросов^_^