Postgresql

另一個模式中的序列權限

  • February 13, 2018

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 函式”一章。

引用自:https://dba.stackexchange.com/questions/76131