Postgresql
另一個模式中的序列權限
Postgres 9.3 Debian 7.0
我為特定使用者創建了一個特定的模式,並在這個模式中為這個使用者創建了一個視圖,所以這是他知道的唯一存在的表。問題是同一使用者需要使用此表的主鍵序列,但它顯示“錯誤:序列權限被拒絕”
原始表及其序列屬於模式 A。該使用者的模式 B 具有該表 T 的可插入視圖。我不能授予該使用者使用模式 A 的權限,否則他將能夠看到所有的名稱和定義我的桌子。
問題是:有沒有辦法為這個序列創建某種視圖,以便他可以呼叫 nextval() 和 currval()?目標是使此序列可供此受限使用者使用,而無需讓他訪問該序列實際所屬的主模式。
這是可以做到的。
主鍵的預設列
serial
通常定義為:ALTER TABLE schema_a.tbl ALTER COLUMN tbl_id SET DEFAULT nextval('schema_a.tbl_tbl_id_seq'::regclass);
兩種選擇:
1.移動順序(我的偏好)
到
public
架構 - 或任何具有足夠權限的架構:GRANT USAGE ON SCHEMA public TO public; -- or: my_group
將序列移動到另一個模式很容易:
ALTER SEQUENCE schema_a.tbl_tbl_id_seq SET SCHEMA public;
現在您可以授予
USAGE
:GRANT USAGE ON SEQUENCE public.tbl_tbl_id_seq TO public; -- or: my_group
這會保留所有引用(包括列預設值)。
2. 函式包裝器
SECURITY DEFINER
如果由於某種原因無法移動序列(想不出一個),您也可以在自己的函式中使用
SECURITY DEFINER
.public
同樣,在模式(或任何對您的使用者具有足夠權限的模式)中創建這些函式:CREATE OR REPLACE FUNCTION public.next_tbl_tbl_id_seq() RETURNS bigint AS $func$ SELECT nextval('schema_a.tbl_tbl_id_seq'::regclass) $func$ LANGUAGE plpgsql SECURITY DEFINER SET search_path = schema_a, pg_temp; ALTER FUNCTION shop.f_deswap_name(text) OWNER TO owning_role;
owning_role
序列的所有者或具有足夠權限的任何角色在哪裡。類似的功能currval()
…請務必閱讀手冊中的“安全地編寫 SECURITY DEFINER 函式”一章。