这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

继承的权限

您可以在三个级别管理权限继承:

  • 数据库

  • 架构

  • 表和视图

默认情况下,继承权限在数据库级别启用,在架构级别禁用。如果在两个级别都启用了权限继承,表和视图在创建时会自动继承这些权限。您还可以排除特定表和视图的继承。

1 - 启用数据库继承

默认情况下,通过配置参数 disableinheritedprivileges 在数据库级别启用继承权限。要启用继承的权限:

=> ALTER DATABASE [database name] SET disableinheritedprivileges = 0;

要禁用继承的权限:

=> ALTER DATABASE [database name] SET disableinheritedprivileges = 1;

2 - 启用架构继承

默认情况下,在架构级别禁用继承的权限。如果为数据库启用了继承的权限,您可以使用 CREATE SCHEMAALTER SCHEMA 允许数据库的表和视图继承架构权限。除非显式排除,否则在架构上授予的权限将自动由其中的所有新表和视图继承。

有关哪些表和视图从哪些架构继承权限的信息,请参阅 INHERITING_OBJECTS

有关每个表或视图继承哪些权限的信息,请参阅 INHERITED_PRIVILEGES

启用架构权限继承对现有的表和视图不起作用。您必须使用 ALTER TABLEALTER VIEW 针对现有的表和视图显式设置架构继承。您还可以分别使用 CREATE TABLE/ALTER TABLECREATE 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

另请参阅

3 - 设置表和视图的权限继承

如果为数据库和架构启用了继承的权限,则授予架构的权限将自动授予其中的所有新表和视图。您还可以显式排除表和视图继承架构权限。

有关哪些表和视图从哪些架构继承权限的信息,请参阅 INHERITING_OBJECTS

有关每个表或视图继承哪些权限的信息,请参阅 INHERITED_PRIVILEGES

设置表和视图的权限继承

CREATE TABLE/ALTER TABLECREATE 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 TABLEALTER VIEW 对它们显式设置架构继承:

=> ALTER TABLE s2.t22 INCLUDE SCHEMA PRIVILEGES;

排除表和视图继承权限

您可以使用 CREATE TABLE/ALTER TABLECREATE VIEW/ALTER VIEW 禁止表和视图继承架构权限。

以下示例显示了如何创建不继承架构权限的表:

=> CREATE TABLE s1.t1 ( x int) EXCLUDE SCHEMA PRIVILEGES;

您可以修改现有表,使其不继承架构权限:

=> ALTER TABLE s1.t1 EXCLUDE SCHEMA PRIVILEGES;

4 - 示例用法:实施继承的权限

以下步骤显示了用户 Joe 如何针对给定架构启用权限继承,以便其他用户可以访问该架构中的表。

  1. 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
    
  2. Joe 将对 schema1 的 USAGE 和 CREATE 权限授予 Myra

    
    => GRANT USAGE, CREATE ON SCHEMA schema1 to Myra;
    GRANT PRIVILEGE
    
  3. Myra 查询 schema1.table1,但查询失败:

    
    =>\c - Myra
    You are now connected as user Myra
    => SELECT * FROM schema1.table1;
    ERROR 4367: Permission denied for relation table1
    
  4. Joe 授予 Myraschema1SELECT ON SCHEMA 权限:

    
    =>\c - Joe
    You are now connected as user Joe
    => GRANT SELECT ON SCHEMA schema1 to Myra;
    GRANT PRIVILEGE
    
  5. Joe 使用 ALTER TABLE 包含 table1 的 SCHEMA 权限:

    
    => ALTER TABLE schema1.table1 INCLUDE SCHEMA PRIVILEGES;
    ALTER TABLE
    
  6. Myra的查询现在成功:

    
    =>\c - Myra
    You are now connected as user Myra
    => SELECT * FROM schema1.table1;
    id
    ---
    (0 rows)
    
  7. 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
    
  8. 启用继承的权限后,Myra 可以查询 table2,而 Joe 不必显式授予对表的权限:

    
    =>\c - Myra
    You are now connected as user Myra
    => SELECT * FROM schema1.table2;
    id
    ---
    (0 rows)