假设我在一个名为test的模式中有一组表,现在我想要一个新用户,应该有权访问这个模式来执行INSERT,SELECT,UPDATE和DELETE。现在我想授权此用户在同一模式中创建新表并更改由用户单独创建的表,而用户不应该更改由其他一些用户创建的现有表或者postgres user.How这可以在Postgresql 9.5.9中完成。
所有请求都是我认为的“默认”行为,例如:
t=# create schema s1;
CREATE SCHEMA
t=# alter schema s1 owner to u1;
ALTER SCHEMA
t=# set role u1;
SET
t=> create table s1.t1(i int);
CREATE TABLE
t=> reset role;
RESET
t=# create user u2;
CREATE ROLE
t=# grant all on s1.t1 to u2;
GRANT
t=# grant usage on schema s1 to u2;
GRANT
t=# set role u2;
SET
t=> insert into s1.t1 select 1;
INSERT 0 1
t=> alter table s1.t1 add column n int;
ERROR: must be owner of relation t1
t=# grant create on schema s1 to u2;
GRANT
t=> create table s1.t2 (i int);
CREATE TABLE
t=> insert into s1.t2 select 1;
INSERT 0 1
t=> alter table s1.t2 add column n int;
ALTER TABLE
(全部以超级用户身份运行)
我自己找到了解决方案,已经存在的旧表是由其他用户创建的,因此表的所有者将是另一个用户,现在我授予了所有权限,然后在模式上使用了grant,新用户是现在只能更改由他创建的表,而新用户无法更改由其他用户创建的表。
将SCHEMA schema_name上的所有特权授予new_user_name;
将SCHEMA schema_name的GRANT USAGE用于new_user_name;
这按预期工作。