2015-02-09 50 views
-2

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

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的确切语法)。

在评论中提出了一个触发器,但我不知道如何通过触发器来实现。

+2

触发器怎么样?有了它,你可以防止超级用户的更新。 – 2015-02-09 17:05:00

+0

主题表具有可更新的其他字段(“内容”为文本),因此触发器应只保留对“依赖性”字段进行的更改。如果不可能,只要告诉我将“内容”移动到另一个表格。这只是我从来没有使用过触发器,所以我不知道从哪里开始 – GameDeveloper 2015-02-09 17:21:02

+0

查看答案。在postgresql中,你可以在列上使用触发器。只有当价值真的不同时,你才可以用它来提高信息。如果需要.. – 2015-02-09 17:24:20

回答

3

试试这个:

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(); 

刚刚定制的 “没办法” 的消息。

+0

获得您的权限并且您不需要像这样的工作。 – 2015-02-09 20:56:39

+1

非建设性的评论家,如果你知道答案存在,展示它。 – GameDeveloper 2015-02-10 14:02:57

+0

@FrankHeikens,实际上触发器也会阻止超级用户修改数据。这将防止错误和未来的权限配置错误。它不是那么糟糕:-) – 2015-02-10 14:36:19

4

PostgreSQL支持列级权限。你可能需要沿着这些路线。

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