点击上方蓝字关注我们

点击上方蓝字关注我们



demodb=# SELECT current_user;current_user--------------postgres(1 row)demodb=# CREATE SCHEMA test;CREATE SCHEMAdemodb=# GRANT USAGE ON SCHEMA test TO obj_user;GRANTdemodb=# CREATE TABLE test.city(id int, name varchar);CREATE TABLEdemodb=# INSERT INTO test.city VALUES(1,'Mumbai');INSERT 0 1
demodb=# SET ROLE obj_user;SETdemodb=> SELECT * FROM test.city;ERROR: permission denied for table city
demodb=> SET ROLE postgres;SETdemodb=# GRANT SELECT ON TABLE test.city TO obj_user;GRANT
demodb=# SET ROLE obj_user;SETdemodb=> SELECT * FROM test.city;id | name----+--------1 | Mumbai(1 row)

让我们授予默认权限并再次测试对新对象的访问权限:
demodb=# SELECT current_user;current_user--------------postgres(1 row)demodb=# ALTER DEFAULT PRIVILEGES IN SCHEMA test GRANT SELECT ON TABLES TO obj_user;ALTER DEFAULT PRIVILEGESdemodb=# CREATE TABLE test.state(id int, name varchar);CREATE TABLEdemodb=# INSERT INTO test.state VALUES(1,'Maharashtra');INSERT 0 1
demodb=# SET ROLE obj_user;SETdemodb=> SELECT * FROM test.state;id | name----+-------------1 | Maharashtra(1 row)
demodb=> SET ROLE obj_creator;SETdemodb=> CREATE TABLE test.nationality(id int, name varchar);CREATE TABLEdemodb=> INSERT INTO test.nationality VALUES(1,'Indian');INSERT 0 1
demodb=> SET ROLE obj_user;SETdemodb=> SELECT * FROM test.nationality;ERROR: permission denied for table nationality

在这里,用户obj_user不会自动获得对新创建的表的权限,因为默认权限仅在对象创建者与语句的执行者相同(默认情况下,当前用户,在本例中为 postgres)时有效。ALTER DEFAULT PRIVILEGES

demodb=# SELECT current_user;current_user--------------postgres(1 row)demodb=# ALTER DEFAULT PRIVILEGES IN SCHEMA test FOR ROLE obj_creator GRANT SELECT ON TABLES to obj_user;ALTER DEFAULT PRIVILEGES
demodb=# set role obj_creator;SETdemodb=> create table test.citizen(id int, name varchar);CREATE TABLEdemodb=> insert into test.citizen values(1, 'David');INSERT 0 1
demodb=> set role obj_user;SETdemodb=> select * from test.citizen;id | name----+-------1 | David(1 row)

ALTER DEFAULT PRIVILEGES IN SCHEMA test FOR ROLE obj_creator GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO obj_user;ALTER DEFAULT PRIVILEGES IN SCHEMA test FOR ROLE obj_creator GRANT USAGE ON TYPES TO obj_user;ALTER DEFAULT PRIVILEGES IN SCHEMA test FOR ROLE obj_creator GRANT EXECUTE ON FUNCTIONS TO obj_user;ALTER DEFAULT PRIVILEGES IN SCHEMA test FOR ROLE obj_creator GRANT SELECT ON SEQUENCES TO obj_user;ALTER DEFAULT PRIVILEGES FOR ROLE obj_creator GRANT USAGE ON SCHEMAS TO obj_user;

ALTER DEFAULT PRIVILEGES IN SCHEMA test FOR ROLE obj_creator REVOKE INSERT,UPDATE,DELETE ON TABLES FROM obj_user;ALTER DEFAULT PRIVILEGES IN SCHEMA test FOR ROLE obj_creator REVOKE USAGE ON types FROM obj_user;ALTER DEFAULT PRIVILEGES IN SCHEMA test FOR ROLE obj_creator REVOKE execute ON functions FROM obj_user;ALTER DEFAULT PRIVILEGES IN SCHEMA test FOR ROLE obj_creator REVOKE SELECT ON sequences FROM obj_user;ALTER DEFAULT PRIVILEGES FOR ROLE obj_creator REVOKE USAGE ON SCHEMAS FROM obj_user;

demodb=# ddpDefault access privilegesOwner | Schema | Type | Access privileges-------------+--------+-------+------------------------obj_creator | test | table | obj_user=r/obj_creatorpostgres | test | table | obj_user=r/postgres(2 rows)
demodb=# SELECTdefaclnamespace::regnamespace AS schema,CASE defaclobjtype WHEN 'r' THEN 'table' WHEN 'S' THEN 'sequence' WHEN 'T' THEN 'type' WHEN 'n' THEN 'schema' END AS obj_type,(aclexplode(defaclacl)).privilege_type AS privilege_type,(aclexplode(defaclacl)).grantor::regrole AS for_role,(aclexplode(defaclacl)).grantee::regrole AS to_userFROM pg_default_acl;schema | obj_type | privilege_type | for_role | to_user--------+----------+----------------+-------------+----------test | table | SELECT | postgres | obj_usertest | table | SELECT | obj_creator | obj_user(2 rows)
使用 ALTER DEFAULT PRIVILEGES

文章转载自KunlunBase 昆仑数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





