在 PostgreSQL 中的表上禁用 DELETE?

Posted

技术标签:

【中文标题】在 PostgreSQL 中的表上禁用 DELETE?【英文标题】:Disable DELETE on table in PostgreSQL? 【发布时间】:2012-07-03 03:33:26 【问题描述】:

对于安全敏感的设计,我想在某些表上禁用 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 删除相关表的权限,并创建存储过程以进行删除...以及更新和插入也可能。

【讨论】:

谢谢!我想将此 undelete 设计纳入数据模型,而不是管理(撤销) - 所以我想我会尝试 INSTEAD 规则。 ON DELETE DO INSTEAD NOTHING 的问题是,发出 DELETE 的代码不会收到没有任何事情发生的通知 - 客户端的 DELETE 将成功并且可能会发生静默错误。

以上是关于在 PostgreSQL 中的表上禁用 DELETE?的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在页面加载时禁用 DataTables 中的排序?

如何在两个大型 postgreSQL 表上批量运行外连接?

PostgreSQL ALTER TABLE 命令

SELECT DISTINCT 在我的 PostgreSQL 表上比预期的要慢

13.PostgreSQL Alter,Truncate Table

Postgresql 序列生成器如何工作?