Правило обновления Postgres, возвращающее количество затронутых строк - PullRequest
2 голосов
/ 10 апреля 2010

У меня есть таблица представления, которая представляет собой объединение двух отдельных таблиц (скажем, Таблица _A и Таблица _B).

Мне нужно иметь возможность обновить строку в таблице представлений, и, похоже, это можно сделать с помощью «правила просмотра». Все записи в таблице представлений имеют отдельные идентификаторы, поэтому идентификатор, который существует в таблице _A, не будет существовать в таблице _B.

Я создал следующее правило:

CREATE OR REPLACE RULE view_update AS
    ON UPDATE TO viewtable DO INSTEAD ( UPDATE _A SET foo = false
  WHERE old.id = _A.id;
 UPDATE _B SET foo = false
  WHERE old.id = _B.id;
);

Если я обновлю таблицу _B, она вернет правильное количество затронутых строк (1). Однако если я обновлю таблицу _A, она вернет (0) затронутых строк, даже если данные были изменены. Если я поменяю порядок обновлений, произойдет то же самое, но в обратном порядке.

Как я могу решить эту проблему, чтобы она возвращала правильное количество затронутых строк.

Спасибо.

Ответы [ 3 ]

1 голос
/ 10 апреля 2010

Вы не можете. Если вы не сделаете это в хранимой процедуре и не вернете количество затронутых строк.

Хорошее объяснение в официальном Документ

0 голосов
/ 21 октября 2016

Как указано в Раздел 39.6. Правила и статус команд

Если для запроса существует какое-либо безусловное правило INSTEAD, то исходный запрос вообще не будет выполнен. В этом случае сервер вернет статус команды для последнего запроса , который был вставлен правилом INSTEAD (условный или безусловный) и равен того же типа команды (INSERT, UPDATE или УДАЛИТЬ) в качестве исходного запроса. Если ни один запрос, отвечающий этим требованиям, не добавлен каким-либо правилом, то в возвращенном состоянии команды отображается исходный тип запроса и нули для полей количества строк и OID.

В моем случае мне удалось обойтись, выставив отношение, используя вид и триггер INSTEAD OF для вида.

0 голосов
/ 11 апреля 2010

Это правильно. PostgreSQL не может узнать об этом через правило. Далее, правила медленные. Вы действительно должны рассмотреть триггер вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...