Подтвердить что ты не робот

Отключить DELETE в таблице в PostgreSQL?

Для чувствительной к безопасности конструкции я хотел бы отключить DELETEs для определенных таблиц.

DELETE должен просто установить флаг deleted в строке (который затем будет отображаться в представлении, которое будет использоваться прикладным уровнем).

Как я понимаю, rule будет генерировать дополнительные запросы, поэтому правило не может подавить исходный запрос.

В качестве иллюстрации пример игрушки с триггером (еще не проверен):

-- data in this table should be 'undeletable'
CREATE table article (
    id serial,
    content text not null,
    deleted boolean default false
)

-- some view that would only show articles, that are NOT deleted
...

-- toy trigger (not tested)
CREATE OR REPLACE FUNCTION suppress_article_delete()
RETURNS TRIGGER AS $sad$
BEGIN
    IF (TG_OP = 'DELETE') THEN
        UPDATE article SELECT id, content, TRUE;
        -- NEW or NULL??
        RETURN NEW;
    END IF;
    RETURN NULL;
END;
$sad$ LANGUAGE plpgsql;

Что было бы хорошим способом подавить DELETE?

4b9b3361

Ответ 1

Как я понимаю, правило будет генерировать дополнительные запросы, поэтому правило не может подавить исходный запрос.

Не совсем - это может быть правило INSTEAD:

 CREATE RULE shoe_del_protect AS ON DELETE TO shoe DO INSTEAD NOTHING;

(пример на той же странице руководства).

Другой способ: REVOKE удалить привилегии в соответствующей таблице и создать хранимую процедуру для удаления... и, возможно, также обновить и вставить.