2015-02-09 71 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;