另一个模式中的序列权限

Iva*_*Paz 4 schema postgresql permissions sequence postgresql-9.3

Postgres 9.3 Debian 7.0

我为特定用户创建了特定模式,并在此模式中为该用户创建了一个视图,因此这是他知道存在的唯一表。问题是这个用户需要使用这个表的主键的序列,但它说“错误:序列的权限被拒绝”

原始表及其序列属于模式 A。此用户的模式 B 具有此表 T 的可插入视图。我不能为该用户授予模式 A 的使用权,否则他将能够看到所有的名称和定义我的桌子。

问题是:有没有办法为这个序列创建某种视图,以便他可以调用 nextval() 和 currval()?目标是使该序列可用于该受限用户,而无需让他访问该序列实际所属的主模式。

Erw*_*ter 6

这是可以做到的。主键的
默认列serial通常定义为:

ALTER TABLE schema_a.tbl ALTER COLUMN tbl_id
SET DEFAULT nextval('schema_a.tbl_tbl_id_seq'::regclass);
Run Code Online (Sandbox Code Playgroud)

两种选择:

1. 移动顺序(我的偏好)

public架构 - 或任何具有足够权限的架构:

GRANT USAGE ON SCHEMA public TO public; -- or: my_group
Run Code Online (Sandbox Code Playgroud)

将序列移动到另一个模式很容易:

ALTER SEQUENCE schema_a.tbl_tbl_id_seq SET SCHEMA public;
Run Code Online (Sandbox Code Playgroud)

现在您可以授予USAGE

GRANT USAGE ON SEQUENCE public.tbl_tbl_id_seq TO public; -- or: my_group
Run Code Online (Sandbox Code Playgroud)

这会保留所有引用(包括列默认值)。

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;
Run Code Online (Sandbox Code Playgroud)

owning_role序列的所有者或具有足够权限的任何角色在哪里。类似的功能currval()...

请务必阅读手册中的“安全地编写 SECURITY DEFINER 函数”一章。