Отключить 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
?
Ответы
Ответ 1
Как я понимаю, правило будет генерировать дополнительные запросы, поэтому правило не может подавить исходный запрос.
Не совсем - это может быть правило INSTEAD
:
CREATE RULE shoe_del_protect AS ON DELETE TO shoe DO INSTEAD NOTHING;
(пример на той же странице руководства).
Другой способ: REVOKE
удалить привилегии в соответствующей таблице и создать хранимую процедуру для удаления... и, возможно, также обновить и вставить.