2017-06-01 68 views
3

如何鎖定某些列不被編輯,即使用戶有權訪問postgresql中的表的編輯權限。如何在postgresql中鎖定用戶未編輯的某些列

+1

唯一可靠的方法是撤銷更新這些列的權限。 –

+0

我不認爲你可以用'GRANT' /'REVOKE'來做到這一點。但是你可以用不同的所有者/權限創建一個可寫視圖,這可以省略一些列和/或使某些只能讀取(具有明確的「INSTEAD OF」觸發器或規則)。 – pozs

+0

或猴子用觸發器破解 - 返回null而不是NEW –

回答

1

您可以添加barfs如果禁止列被改爲觸發:

CREATE OR REPLACE FUNCTION cerberus() RETURNS trigger 
    LANGUAGE plpgsql AS 
$$BEGIN 
    IF NEW.forbiddencol IS DISTINCT FROM OLD.forbiddencol 
     AND current_user = 'luser' 
    THEN 
     RAISE EXCEPTION '"luser" must not update "forbiddencol"'; 
    END IF; 
    RETURN NEW; 
END;$$; 

CREATE TRIGGER cerberus BEFORE UPDATE OF mytable 
    FOR EACH ROW EXECUTE PROCEDURE cerberus(); 
+0

你可以請分享一些樣本片段嗎? –

+0

我已經添加了一個示例。 –

+1

如果old或new爲null,則不會阻止更新,因爲'1 <> null時選擇大小寫,那麼true否則false end將返回'false'。 –

3

PostgreSQL支持列安全性(以及行安全)

讓我們把我們有限的作用authors

create table staff (
    name text primary key, 
    salary decimal(19,4) 
); 

create role authors; 

grant select, insert, delete, update(name) on table staff to authors; 

set role authors; 

insert into staff values ('frank', 100); -- works! 

select * from staff; -- works! 

update staff set name='jim'; -- works! 

update staff set salary=999; -- permission denied 
相關問題