Postgres: проверка значения перед условным запуском обновления или удаления - PullRequest
2 голосов
/ 26 октября 2010

У меня есть довольно простая таблица, в которой хранятся авторы записей в текстовом поле, как показано здесь:

CREATE TABLE "public"."test_tbl" (
  "index" SERIAL, 
  "testdate" DATE, 
  "pfr_author" TEXT DEFAULT "current_user"(), 
  CONSTRAINT "test_tbl_pkey" PRIMARY KEY("index");

Пользователь никогда не увидит поля index или pfr_author, но я бы хотел, чтобы они могли ОБНОВИТЬ поле testdate или УДАЛИТЬ целые записи, если у них есть разрешение и если они являются автором. то есть, если test_tbl.pfr_author = CURRENT_USER THEN разрешают ОБНОВЛЕНИЕ ИЛИ УДАЛЕНИЕ, но если нет, выдают сообщение об ошибке, например «Извините, у вас нет прав на редактирование этой записи.».

Я не пошел по пути использования триггера, так как считаю, что даже если он будет выполнен до обновления строки, запрошенное пользователем обновление все равно будет иметь место впоследствии.

Я пытался сделать это с помощью правила, но в итоге получаю бесконечную рекурсию, когда я помещаю команду обновления внутри правила. Есть ли способ сделать это, используя только правила или комбинацию правила и триггера?

Большое спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 27 октября 2010

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

CREATE OR REPLACE FUNCTION "public"."test_tbl_trig_func" () RETURNS trigger AS $body$ 
BEGIN 
IF not (old.pfr_author = "current_user"() OR "current_user"() = 'postgres') THEN 
    NULL;  
END IF; 
RETURN new;
END; 
$body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER COST 100; 

У меня есть такой тест, он хорошо работает;

UPDATE test_tbl SET testdate = CURRENT_DATE WHERE test_tbl."index" = 2; 
0 голосов
/ 26 октября 2010

Используйте уровень строки ДО триггера на ОБНОВЛЕНИЕ и УДАЛИТЬ, чтобы сделать это.Просто верните NULL, если операция не разрешена и операция будет пропущена.

http://www.postgresql.org/docs/9.0/interactive/trigger-definition.html

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