PostgreSQL 防止每个人都更新列

PostgreSQL Prevent updating columns EVERYONE

我想阻止用户(每个人)更新主题的特定列以防止循环依赖。

CREATE TABLE Topic(
    id          serial    NOT NULL PRIMARY KEY,
    contenxt    text      DEFAULT NULL, -- can be freely updated
    Dependency1 serial    REFERENCES Topic(id) ON DELETE RESTRICT, -- CAN'T be updated
    Dependency2 serial    REFERENCES Topic(id) ON DELETE RESTRICT, -- CAN'T be updated
);

DENY UPDATE ON Topic(Dependency1) TO *; -- Here
DENY UPDATE ON Topic(Dependency2) TO *;

但在尝试了几个变体之后,它似乎总是报告一些语法错误。解决这个问题开始很无聊。欢迎使用其他解决方案,但我认为此解决方案相当简单(前提是您知道 u.u 的确切语法)。

在评论中建议使用触发器,但我不知道如何使用触发器来实现。

试试这个:

CREATE OR REPLACE FUNCTION fnprevent_update()
  RETURNS trigger AS
$BODY$
    BEGIN
        RAISE EXCEPTION 'no way';
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;



CREATE TRIGGER trg_prevent_update
  BEFORE UPDATE OF dependency1, dependency2
  ON topic
  FOR EACH ROW
  EXECUTE PROCEDURE fnprevent_update();

只需自定义 "no way" 消息。

PostgreSQL 支持列级权限。您可能需要这些方面的东西。

grant select(id, dependency1, dependency2), update(id) on topic to public;