您可以在三个级别管理权限继承:
-
数据库
-
架构
-
表和视图
默认情况下,继承权限在数据库级别启用,在架构级别禁用。如果在两个级别都启用了权限继承,新表和视图在创建时会自动继承这些权限。您还可以排除特定表和视图的继承。
您可以在三个级别管理权限继承:
数据库
架构
表和视图
默认情况下,继承权限在数据库级别启用,在架构级别禁用。如果在两个级别都启用了权限继承,新表和视图在创建时会自动继承这些权限。您还可以排除特定表和视图的继承。
默认情况下,通过配置参数 disableinheritedprivileges
在数据库级别启用继承权限。要启用继承的权限:
=> ALTER DATABASE [database name] SET disableinheritedprivileges = 0;
要禁用继承的权限:
=> ALTER DATABASE [database name] SET disableinheritedprivileges = 1;
使用 ALTER SCHEMA 启用继承权限DEFAULT INCLUDE PRIVILEGES 仅影响新创建的表和视图。
此设置不会影响已存在的表和视图。
默认情况下,在架构级别禁用继承的权限。如果为数据库启用了继承的权限,您可以使用 CREATE SCHEMA 和 ALTER SCHEMA 允许数据库的表和视图继承架构权限。除非显式排除,否则在架构上授予的权限将自动由其中的所有新表和视图继承。
有关哪些表和视图从哪些架构继承权限的信息,请参阅 INHERITING_OBJECTS。
有关每个表或视图继承哪些权限的信息,请参阅 INHERITED_PRIVILEGES。
如果针对数据库禁用继承的权限,则对其架构启用继承不起作用。尝试启用可能会返回以下消息:
Inherited privileges are globally disabled; schema parameter is set but has no effect.
启用架构权限继承对现有的表和视图不起作用。您必须使用 ALTER TABLE 和 ALTER VIEW 针对现有的表和视图显式设置架构继承。您还可以分别使用 CREATE TABLE/ALTER TABLE 和 CREATE VIEW/ALTER VIEW 显式排除表和视图继承架构权限。
您可以在架构创建期间使用以下语句启用架构权限继承:
=> CREATE SCHEMA s1 DEFAULT INCLUDE PRIVILEGES;
如果架构已经存在,您可以使用 ALTER SCHEMA 让所有新创建的表和视图继承架构的权限。在此语句之前在架构上创建的表和视图不受影响:
=> ALTER SCHEMA s1 DEFAULT INCLUDE PRIVILEGES;
在架构上启用继承的权限后,可以使用 GRANT(架构) 将架构权限授予用户和角色:
=> GRANT USAGE, CREATE, SELECT, INSERT ON SCHEMA S1 TO PUBLIC;
GRANT PRIVILEGE
使用 ALTER SCHEMA 启用继承权限DEFAULT INCLUDE PRIVILEGES 仅影响新创建的表和视图。
此设置不会影响已存在的表和视图。
如果为数据库和架构启用了继承的权限,则授予架构的权限将自动授予其中的所有新表和视图。您还可以显式排除表和视图继承架构权限。
有关哪些表和视图从哪些架构继承权限的信息,请参阅 INHERITING_OBJECTS。
有关每个表或视图继承哪些权限的信息,请参阅 INHERITED_PRIVILEGES。
CREATE TABLE/ALTER TABLE 和 CREATE VIEW/ALTER VIEW 可以允许表和视图从其父架构继承权限。例如,以下语句在架构 s1 上启用继承,因此新表 s1.t1 和视图 s1.myview 会自动继承在该架构上设置的权限(如果适用):
=> CREATE SCHEMA s1 DEFAULT INCLUDE PRIVILEGES;
CREATE SCHEMA
=> GRANT USAGE, CREATE, SELECT, INSERT ON SCHEMA S1 TO PUBLIC;
GRANT PRIVILEGE
=> CREATE TABLE s1.t1 ( ID int, f_name varchar(16), l_name(24));
WARNING 6978: Table "t1" will include privileges from schema "s1"
CREATE TABLE
=> CREATE VIEW s1.myview AS SELECT ID, l_name FROM s1.t1
WARNING 6978: View "myview" will include privileges from schema "s1"
CREATE VIEW
如果架构已经存在,您可以使用 ALTER SCHEMA 让所有新创建的表和视图继承架构的权限。但是,在此语句之前在架构上创建的表和视图不受影响:
=> CREATE SCHEMA s2;
CREATE SCHEMA
=> CREATE TABLE s2.t22 ( a int );
CREATE TABLE
...
=> ALTER SCHEMA S2 DEFAULT INCLUDE PRIVILEGES;
ALTER SCHEMA
在此例中,在架构 s2 已经包含表 s2.t22 之后,在该架构上启用继承的权限。要在此表和其他现有表和视图上设置继承,必须使用 ALTER TABLE 和 ALTER VIEW 对它们显式设置架构继承:
=> ALTER TABLE s2.t22 INCLUDE SCHEMA PRIVILEGES;
您可以使用 CREATE TABLE/ALTER TABLE 和 CREATE VIEW/ALTER VIEW 禁止表和视图继承架构权限。
以下示例显示了如何创建不继承架构权限的表:
=> CREATE TABLE s1.t1 ( x int) EXCLUDE SCHEMA PRIVILEGES;
您可以修改现有表,使其不继承架构权限:
=> ALTER TABLE s1.t1 EXCLUDE SCHEMA PRIVILEGES;
以下步骤显示了用户 Joe
如何针对给定架构启用权限继承,以便其他用户可以访问该架构中的表。
Joe
创建架构 schema1
,并在其中创建表 table1
:
=>\c - Joe
You are now connected as user Joe
=> CREATE SCHEMA schema1;
CRDEATE SCHEMA
=> CREATE TABLE schema1.table1 (id int);
CREATE TABLE
Joe
将对 schema1
的 USAGE 和 CREATE 权限授予 Myra
:
=> GRANT USAGE, CREATE ON SCHEMA schema1 to Myra;
GRANT PRIVILEGE
Myra
查询 schema1.table1
,但查询失败:
=>\c - Myra
You are now connected as user Myra
=> SELECT * FROM schema1.table1;
ERROR 4367: Permission denied for relation table1
Joe
授予 Myra
对 schema1
的 SELECT ON SCHEMA
权限:
=>\c - Joe
You are now connected as user Joe
=> GRANT SELECT ON SCHEMA schema1 to Myra;
GRANT PRIVILEGE
Joe
使用 ALTER TABLE
包含 table1
的 SCHEMA 权限:
=> ALTER TABLE schema1.table1 INCLUDE SCHEMA PRIVILEGES;
ALTER TABLE
Myra
的查询现在成功:
=>\c - Myra
You are now connected as user Myra
=> SELECT * FROM schema1.table1;
id
---
(0 rows)
Joe
修改 schema1
以包含权限,以便在 schema1
中创建的所有表都继承架构权限:
=>\c - Joe
You are now connected as user Joe
=> ALTER SCHEMA schema1 DEFAULT INCLUDE PRIVILEGES;
ALTER SCHEMA
=> CREATE TABLE schema1.table2 (id int);
CREATE TABLE
启用继承的权限后,Myra
可以查询 table2
,而 Joe
不必显式授予对表的权限:
=>\c - Myra
You are now connected as user Myra
=> SELECT * FROM schema1.table2;
id
---
(0 rows)