对于安全性敏感的设计,我想在某些表上禁用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
的好方法?
答案 0 :(得分:25)
据我所知,规则会生成其他查询 - 因此规则无法抑制原始查询。
不是 - 它可能是INSTEAD
规则:
CREATE RULE shoe_del_protect AS ON DELETE TO shoe DO INSTEAD NOTHING;
(手册同一页上的一个例子)。
另一种方法是REVOKE
删除有问题的表上的权限,并创建用于删除的存储过程......以及可能更新和插入。