2013-08-13 4 views
1

Я хотел бы отключить оператор DELETE на таблице. Что мне нужно сделать, это установить значение поля вместо удаления соответствующей записи.INSTEAD OF DELETE trigger (Postgresql)

До сих пор я попытался следующие:

CREATE TRIGGER delete_trg 
INSTEAD OF DELETE 
ON schema.tbl 
FOR EACH ROW 
EXECUTE PROCEDURE schema.tbl_delete_fn(); 

Моя schema.tbl_delete_fn() функция выглядит следующим образом:

CREATE OR REPLACE FUNCTION schema.tbl_delete_fn() 
    RETURNS trigger AS 
BEGIN 
    NEW.deleted := true; 

    RETURN NEW; 
END; 

До сих пор это не похоже на работу ... любые идеи?

+1

Вы пытаетесь определить триггер на представлении или на столе? –

+1

«Не работает»? Точное поведение, сообщение об ошибке и т. Д.? –

ответ

4

Вы хотите, чтобы триггер BEFORE DELETE возвращал NULL, а переменная строки OLD, а не NEW.

CREATE TRIGGER delete_trg 
BEFORE DELETE 
ON schema.tbl 
FOR EACH ROW 
EXECUTE PROCEDURE schema.tbl_delete_fn(); 

CREATE OR REPLACE FUNCTION schema.tbl_delete_fn() 
    RETURNS trigger AS ' 
BEGIN 
    UPDATE schema.tbl SET deleted=true WHERE ctid=OLD.ctid; 
    RETURN NULL; 
END; ' language plpgsql; 
+0

Этот триггер заблокирует 'DELETE', но не изменит строку, которая будет удалена. –

+0

@Igor: вы правы, отредактированы, чтобы вместо этого использовать UPDATE, протестированы и, похоже, работают –

2

Или ...

CREATE RULE delete_rule 
AS ON DELETE TO schema.tbl 
DO INSTEAD NOTHING; 

Плюсы: Яснее, код не вызывается для каждой строки, посещенных и не требуется SP.

Против: Менее стандартное, чем триггерное решение.

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