ALTER DEFAULT PRIVILEGES - 权限被拒绝

sko*_*mar 9 postgresql permissions

我对 ALTER DEFAULT PRIVILEGES 有问题。我授予权限:

ALTER DEFAULT PRIVILEGES 
    FOR USER user_name
    IN SCHEMA schema_name
    GRANT SELECT ON TABLES TO user_name;
Run Code Online (Sandbox Code Playgroud)

在下一步我创建一个表

create table schema_name.a (q int);
Run Code Online (Sandbox Code Playgroud)

现在,我使用 conn_user 连接到 dabasabe 并尝试读取新表中的数据。

select * from schema_name.a
Run Code Online (Sandbox Code Playgroud)

我收到错误:

SQL Error [42501]: ERROR: permission denied for relation a
  org.postgresql.util.PSQLException: ERROR: permission denied for relation a
Run Code Online (Sandbox Code Playgroud)

您知道为什么会出现错误吗?

dez*_*zso 9

这里的问题是ALTER DEFAULT PRIVILEGES您发出的语句仅适用于由user_name以下人员创建的表:

您只能更改将由您自己或您所属的角色创建的对象的默认权限。

目标角色

当前角色是其成员的现有角色的名称。如果省略 FOR ROLE,则假定当前角色。

所以在你的情况下,你要么使用

ALTER DEFAULT PRIVILEGES 
    IN SCHEMA schema_name
    GRANT SELECT ON TABLES TO user_name;
Run Code Online (Sandbox Code Playgroud)

(没有FOR USER子句),或创建表user_name(在这种情况下,他们将成为所有者,因此无需授予任何权利)。

在任何情况下,始终以给定用户的身份创建 DB 对象是一个好习惯,这样访问权限是可预测的。


小智 6

要授予默认权限,您实际上需要向您创建表的用户授予权限。

例如:您以 SA_user 的身份创建表,但读取的表也是 READ_user。你的代码需要看起来像:

ALTER DEFAULT PRIVILEGES 
FOR USER SA_user
IN SCHEMA schema_name
GRANT SELECT ON TABLES TO READ_user;
Run Code Online (Sandbox Code Playgroud)

因此,每当 SA_user 创建表时,它都会为 READ_user 授予选择权限。