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

返回本页常规视图.

数据库权限

创建数据库对象(例如架构、表或视图)时,该对象的所有权将分配给创建它的用户。默认情况下,只有对象的所有者和具有超级用户权限的用户(如数据库管理员)才对新对象具有权限。只有这些用户(以及他们为其显式授权的其他用户)才能将对象权限授予其他用户

权限分别由 GRANTREVOKE 语句授予和撤销。可以为给定对象授予的权限与对象类型相关。例如,表权限包括 SELECT、INSERT 和 UPDATE,而库和资源池权限仅包括 USAGE 权限。有关对象权限的汇总,请参阅数据库对象权限

由于数据库对象的权限可能来自多个不同的来源(如显式授权、角色和继承),因此权限可能难以监控。使用 GET_PRIVILEGES_DESCRIPTION 元函数检查当前用户从指定数据库对象的所有源获得的有效权限

1 - 所有权和隐式权限

所有用户都对他们拥有的对象拥有隐式权限。在创建对象时,它的所有者会自动被授予与对象类型相关的所有权限(请参阅数据库对象权限)。无论对象类型如何,以下权限都与所有权密不可分并且不能被撤销,即使是所有者也不能撤销:

  • 将所有对象权限授予其他用户并撤销它们

  • ALTER(如适用)和 DROP

  • 扩展以下权限:将对象权限授予其他用户和撤销该权限

对象所有者可以撤销他们自己的所有非隐式或普通权限。例如,在创建表时,它的所有者会自动被授予所有隐式和普通权限:

如果用户 Joan 创建表 t1,她可以撤销自己的普通权限 UPDATE 和 INSERT,这实际上会将该表设为只读:


=> \c - Joan
You are now connected as user "Joan".
=> CREATE TABLE t1 (a int);
CREATE TABLE
=> INSERT INTO t1 VALUES (1);
 OUTPUT
--------
      1
(1 row)

=> COMMIT;
COMMIT
=> REVOKE UPDATE, INSERT ON TABLE t1 FROM Joan;
REVOKE PRIVILEGE
=> INSERT INTO t1 VALUES (3);
ERROR 4367:  Permission denied for relation t1
=> SELECT * FROM t1;
 a
---
 1
(1 row)

Joan 随后可以还原自己的 UPDATE 和 INSERT 权限:


=> GRANT UPDATE, INSERT on TABLE t1 TO Joan;
GRANT PRIVILEGE
dbadmin=> INSERT INTO t1 VALUES (3);
 OUTPUT
--------
      1
(1 row)

=> COMMIT;
COMMIT
dbadmin=> SELECT * FROM t1;
 a
---
 1
 3
(2 rows)

2 - 继承的权限

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

  • 数据库

  • 架构

  • 表和视图

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

2.1 - 启用数据库继承

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

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

要禁用继承的权限:

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

2.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

另请参阅

2.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;

2.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)
    

3 - 默认用户权限

为了向所有用户设置最低级别的权限,Vertica 具有特殊的 PUBLIC 角色,会向每个用户自动授予此角色。此角色会自动启用,但数据库管理员或 超级用户也可以使用 GRANT 语句单独向用户授予更高的权限。

MC 用户的默认权限

管理控制台 (MC) 的权限通过角色进行管理,这些角色确定了用户对 MC 和 MC 管理的 Vertica 数据库(通过 MC 界面)的访问权限。MC 权限不会更改或覆盖 Vertica 权限或角色。有关详细信息,请参阅用户、角色和权限

4 - 有效权限

用户在对象上的有效权限包含所有类型的权限,包括:

您可以使用 GET_PRIVILEGES_DESCRIPTION 元函数查看您在对象上的有效权限。

5 - 常用数据库操作所需的权限

本主题列出了 Vertica 中的数据库对象所需的权限。

除非另有说明,否则 超级用户可以执行下表中显示的所有操作。对象所有者始终可以对自己的对象执行操作。

架构

PUBLIC 架构存在于任何新创建的 Vertica 数据库中。必须授予新创建的用户对此架构的访问权限:

=> GRANT USAGE ON SCHEMA public TO user;

数据库超级用户还必须为新用户显式授予 CREATE 权限,并为他们授予各个对象权限,以便新用户可以在 PUBLIC 架构中创建或查找对象。

视图

投影

外部过程

存储过程

用户定义的函数

序列

资源池

用户/配置文件/角色

对象可见性

您可以使用一个或一组 vsql \d 元命令SQL 系统表来查看您有权查看的对象。

  • 使用 \dn 查看架构名称和所有者。

  • 使用 \dn 查看数据库中的所有表,以及系统表 V_CATALOG.TABLES

  • 使用 \dn 查看显示架构、投影名称、所有者和节点的投影,以及系统表 V_CATALOG.PROJECTIONS

I/O 操作

备注

事务

会话

调整操作

TLS 配置

加密密钥

证书

6 - 数据库对象权限

对于 Vertica 数据库中大多数的用户可见对象(如表和模型),可以显式授予权限。对于某些对象(如投影),权限是从其他对象隐式派生的。

显式授予的权限

下表概述了可为 Vertica 数据库对象显式授予的权限:

隐式授予的权限

元数据权限

超级用户可以无限制地访问所有非加密数据库元数据。对于非超级用户,对特定对象的元数据的访问权限取决于他们对这些对象的权限:

投影权限

用来存储表数据的投影没有与其直接关联的所有者或权限。相反,创建、访问或更改投影的权限派生自针对该投影的锚表和相应架构设置的权限。

加密权限

除非拥有所有权,否则超级用户仅对密钥、证书和 TLS 配置具有隐式 DROP 权限。这让超级用户能够在他们各自的系统表(CRYPTOGRAPHIC_KEYSCERTIFICATESTLS_CONFIGURATIONS)中查看这些对象是否存在并删除它们,但不允许他们查看密钥或证书文本。

有关授予额外权限的详细信息,请参阅 GRANT(密钥)和 GRANT(TLS 配置)。

7 - 授予和撤销权限

Vertica 支持通过 GRANTREVOKE 语句(例如,GRANT(架构)REVOKE(架构)GRANT(表)REVOKE(表) 等等)来控制用户对数据库对象的访问。通常,超级用户会在创建数据库后不久创建用户角色,然后使用 GRANT 语句为所创建的用户和角色分配权限。

在适用的情况下,GRANT 语句需要对象架构的 USAGE 权限。以下用户可以授予和撤销权限:

  • 超级用户:所有数据库对象(包括数据库本身)的所有权限

  • 非超级用户:他们拥有的对象的所有权限

  • 包括 WITH GRANT OPTION 的权限的被授予者:对该对象的相同权限

在以下示例中,dbadmin(具有超级用户权限)创建用户 Carol。随后的 GRANT 语句授予 Carol 架构和表权限:

  • 对架构的 CREATE 和 USAGE 权限 PUBLIC

  • 对表 public.applog 的 SELECT、INSERT 和 UPDATE 权限。此 GRANT 语句还包括 WITH GRANT OPTION。这使得 Carol 可以将此表上的相同权限授予其他用户 — 在本例中,将 SELECT 权限授予用户 Tom

=> CREATE USER Carol;
CREATE USER
=> GRANT CREATE, USAGE ON SCHEMA PUBLIC to Carol;
GRANT PRIVILEGE
=> GRANT SELECT, INSERT, UPDATE ON TABLE public.applog TO Carol WITH GRANT OPTION;
GRANT PRIVILEGE
=> GRANT SELECT ON TABLE public.applog TO Tom;
GRANT PRIVILEGE

7.1 - 超级用户权限

Vertica 超级用户是在安装时自动创建的数据库用户(默认情况下,名为 dbadmin)。Vertica 超级用户对数据库用户、权限和角色拥有完整且不可撤销的授权。

超级用户可以更改任何用户和角色的权限,并覆盖具有 PSEUDOSUPERUSER 角色的用户所授予的任何权限。他们还可以授予和撤销用户拥有的任何对象的权限,并重新分配对象所有权。

加密权限

对于大多数编录对象,超级用户拥有所有可能的权限。但是,对于密钥证书TLS 配置,超级用户在默认情况下只能获得 DROP 权限,并且必须由其所有者授予其他权限。有关详细信息,请参阅 GRANT(密钥)和 GRANT(TLS 配置)。

超级用户可以看到所存在的全部密钥证书TLS 配置,但是,除非向他们授予 USAGE 权限,否则他们看不到密钥或证书的文本。

另请参阅

DBADMIN

7.2 - 架构所有者权限

通常情况下,架构所有者为创建该架构的用户。默认情况下,架构所有者有权在架构内创建对象。所有者还可以更改架构:重新分配所有权、重命名以及启用或禁用架构权限继承。

架构所有权不一定授予所有者对该架构中对象的访问权限。对象访问权限取决于向他们授予的权限。

所有其他用户和角色必须由所有者或超级用户显式授予对架构的访问权限

7.3 - 对象所有者权限

数据库以及其中的每个对象都具有所有者。对象所有者通常是创建该对象的人员,但是超级用户可以更改对象(如表和序列)的所有权。

对象所有者必须具有合适的架构权限才能访问、更改、重命名、移动或删除其拥有的任何对象,而不需要任何额外的权限。

对象所有者还可以:

  • 将自己所拥有的对象的权限授予其他用户

    WITH GRANT OPTION 子句指定用户可以向其他用户授予权限。例如,如果用户 Bob 创建一个表,则 Bob 可以将该表的权限授予用户 Ted、Alice 等等。

  • 将权限授予 **角色**

    被授予角色的用户会获得权限。

7.4 - 授予权限

授予和撤销权限中所述,特定用户可使用带有或不带有可选 WITH GRANT OPTION 的 GRANT 语句授予权限,WITH GRANT OPTION 子句允许用户向其他用户授予相同的权限。

  • 超级用户可向其他用户授予对所有对象类型的权限。

  • 超级用户或对象所有者可向 角色授予权限。然后,被授予角色的用户会获得相应权限。

  • 对象所有者可使用可选的 WITH GRANT OPTION 子句向其他用户授予对于对象的权限。

  • 用户需要具有对架构的 USAGE 权限以及对于对象的相应权限。

当用户授予一个显式的权限列表时,例如 GRANT INSERT, DELETE, REFERENCES ON applog TO Bob

  • 只有成功授予了所有角色,GRANT 语句才会成功执行。如果任一授予操作失败,则整个语句将回退。

  • 如果用户没有所列权限的授予选项,Vertica 将返回 ERROR。

当用户授予 ALL 权限(例如 GRANT ALL ON applog TO Bob)时,语句始终会成功执行。Vertica 会授予授予者具有 WITH GRANT OPTION 的所有权限,而略过没有可选 WITH GRANT OPTION 的权限。

例如,如果用户 Bob 删除了具有可选授予选项的对于表 applog 的权限,则仅会向 Bob 授予 DELETE 权限,语句会成功执行:

=> GRANT DELETE ON applog TO Bob WITH GRANT OPTION;GRANT PRIVILEGE

有关详细信息,请参阅 GRANT 语句

7.5 - 撤销权限

下面的非超级用户可以撤销对象的权限:

  • 对象所有者

  • 对象权限的授予者

用户还必须具有对对象架构的 USAGE 权限。

例如,针对系统表 V_CATALOG.GRANTS 执行以下查询将显示用户 u1u2u3 对架构 s1 和表 s1.t1 具有以下权限:

 => SELECT object_type, object_name, grantee, grantor, privileges_description FROM v_catalog.grants
     WHERE object_name IN ('s1', 't1') AND grantee IN ('u1', 'u2', 'u3');
object_type | object_name | grantee | grantor |  privileges_description
-------------+-------------+---------+---------+---------------------------
 SCHEMA      | s1          | u1      | dbadmin | USAGE, CREATE
 SCHEMA      | s1          | u2      | dbadmin | USAGE, CREATE
 SCHEMA      | s1          | u3      | dbadmin | USAGE
 TABLE       | t1          | u1      | dbadmin | INSERT*, SELECT*, UPDATE*
 TABLE       | t1          | u2      | u1      | INSERT*, SELECT*, UPDATE*
 TABLE       | t1          | u3      | u2      | SELECT*
(6 rows)

在以下语句中,u2 撤销它在 s1.t1 上授予 u3 的 SELECT 权限。u3 随后尝试查询此表时返回错误:

=> \c - u2
You are now connected as user "u2".
=> REVOKE SELECT ON s1.t1 FROM u3;
REVOKE PRIVILEGE
=> \c - u3
You are now connected as user "u2".
=> SELECT * FROM s1.t1;
ERROR 4367:  Permission denied for relation t1

撤销授予选项

如果您撤销用户对某个对象的权限,则该用户不能再将这些相同权限授予其他用户。如果该用户先前已将撤销的权限授予其他用户,则 REVOKE 语句还必须包含 CASCADE 选项才能撤销这些其他用户的权限;否则,它会返回错误。

例如,用户 u2 可以授予 SELECT、INSERT 和 UPDATE 权限,并将这些权限授予用户 u4

=> \c - u2
You are now connected as user "u2".
=> GRANT SELECT, INSERT, UPDATE on TABLE s1.t1 to u4;
GRANT PRIVILEGE

如果您通过查询 V_CATALOG.GRANTS 来查看是否拥有表 s1.t1 的权限,它会返回以下结果集:

=> \ c
You are now connected as user "dbadmin".
=> SELECT object_type, object_name, grantee, grantor, privileges_description FROM v_catalog.grants
     WHERE object_name IN ('t1') ORDER BY grantee;
 object_type | object_name | grantee | grantor |                   privileges_description
-------------+-------------+---------+---------+------------------------------------------------------------
 TABLE       | t1          | dbadmin | dbadmin | INSERT*, SELECT*, UPDATE*, DELETE*, REFERENCES*, TRUNCATE*
 TABLE       | t1          | u1      | dbadmin | INSERT*, SELECT*, UPDATE*
 TABLE       | t1          | u2      | u1      | INSERT*, SELECT*, UPDATE*
 TABLE       | t1          | u4      | u2      | INSERT, SELECT, UPDATE
(3 rows)

现在,如果用户 u1 想要撤销用户 u2 的 UPDATE 权限,则撤销操作必须级联到用户 u4(该用户也拥有 u2 授予的 UPDATE 权限);否则,REVOKE 语句返回错误:

=> \c - u1
=> REVOKE update ON TABLE s1.t1 FROM u2;
ROLLBACK 3052:  Dependent privileges exist
HINT:  Use CASCADE to revoke them too
=> REVOKE update ON TABLE s1.t1 FROM u2 CASCADE;
REVOKE PRIVILEGE
=> \c
You are now connected as user "dbadmin".
=>  SELECT object_type, object_name, grantee, grantor, privileges_description FROM v_catalog.grants
     WHERE object_name IN ('t1') ORDER BY grantee;
 object_type | object_name | grantee | grantor |                   privileges_description
-------------+-------------+---------+---------+------------------------------------------------------------
 TABLE       | t1          | dbadmin | dbadmin | INSERT*, SELECT*, UPDATE*, DELETE*, REFERENCES*, TRUNCATE*
 TABLE       | t1          | u1      | dbadmin | INSERT*, SELECT*, UPDATE*
 TABLE       | t1          | u2      | u1      | INSERT*, SELECT*
 TABLE       | t1          | u4      | u2      | INSERT, SELECT
(4 rows)

您还可以撤销用户的授予者权限而不撤销这些权限。例如,用户 u1 可以阻止用户 u2 将 INSERT 权限授予其他用户,但允许用户 u2 保留该权限:

=> \c - u1
You are now connected as user "u1".
=> REVOKE GRANT OPTION FOR INSERT ON TABLE s1.t1 FROM U2 CASCADE;
REVOKE PRIVILEGE

您可以通过查询 V_CATALOG.GRANTS 表来查看是否拥有 s1.t1 表的权限,从而确认撤销操作的结果:


=> \c
You are now connected as user "dbadmin".
=> SELECT object_type, object_name, grantee, grantor, privileges_description FROM v_catalog.grants
      WHERE object_name IN ('t1') ORDER BY grantee;
 object_type | object_name | grantee | grantor |                   privileges_description
-------------+-------------+---------+---------+------------------------------------------------------------
 TABLE       | t1          | dbadmin | dbadmin | INSERT*, SELECT*, UPDATE*, DELETE*, REFERENCES*, TRUNCATE*
 TABLE       | t1          | u1      | dbadmin | INSERT*, SELECT*, UPDATE*
 TABLE       | t1          | u2      | u1      | INSERT, SELECT*
 TABLE       | t1          | u4      | u2      | SELECT
(4 rows)

查询结果显示:

  • 用户 u2 保留对表的 INSERT 权限,但不能再将 INSERT 权限授予其他用户(没有星号)。

  • 撤销操作向下级联到被授予者 u4,该用户现在失去 INSERT 权限。

另请参阅

REVOKE(表)

7.6 - 权限所有权链

撤销对于对象的权限可能会在整个组织内产生级联影响。如果为用户撤销了授予选项,则此用户授予其他用户的权限也会被撤销。

如果权限是由多个授予者授予用户或角色的,则要为被授予者完全撤销此权限,每个最初授予者都必须撤销该权限。唯一例外是超级用户可以撤销对象所有者授予的权限,反之亦然。

在以下示例中,对表 t1 的 SELECT 权限是通过一个从超级用户到 User3 的用户链授予的。

  • 超级用户为 User1 授予对架构 s1 的 CREATE 权限:

    => \c - dbadmin
    You are now connected as user "dbadmin".
    => CREATE USER User1;
    CREATE USER
    => CREATE USER User2;
    CREATE USER
    => CREATE USER User3;
    CREATE USER
    => CREATE SCHEMA s1;
    CREATE SCHEMA
    => GRANT USAGE on SCHEMA s1 TO User1, User2, User3;
    GRANT PRIVILEGE
    => CREATE ROLE reviewer;
    CREATE ROLE
    => GRANT CREATE ON SCHEMA s1 TO User1;
    GRANT PRIVILEGE
    
  • User1 在架构 s1 中创建新表 t1,然后为 User2 授予对 s1.t1 的 SELECT WITH GRANT OPTION 权限:

    => \c - User1
    You are now connected as user "User1".
    => CREATE TABLE s1.t1(id int, sourceID VARCHAR(8));
    CREATE TABLE
    => GRANT SELECT on s1.t1 to User2 WITH GRANT OPTION;
    GRANT PRIVILEGE
    
  • User2 为 User3 授予对 s1.t1 的 SELECT WITH GRANT OPTION 权限。

    => \c - User2
    You are now connected as user "User2".
    => GRANT SELECT on s1.t1 to User3 WITH GRANT OPTION;
    GRANT PRIVILEGE
    
  • User3 为查看者角色授予对 s1.t1 的 SELECT 权限:

    => \c - User3
    You are now connected as user "User3".
    => GRANT SELECT on s1.t1 to reviewer;
    GRANT PRIVILEGE
    

用户不能撤销处于链上游的权限。例如,User2 没有为 User1 授予权限,因此当 User1 运行以下 REVOKE 命令时,Vertica 会回退命令:

=> \c - User2
You are now connected as user "User2".
=> REVOKE CREATE ON SCHEMA s1 FROM User1;
ROLLBACK 0:  "CREATE" privilege(s) for schema "s1" could not be revoked from "User1"

用户可以间接地为通过级联链接受权限的用户撤销权限,如上例所示。这里,用户可以使用 CASCADE 选项为链“下游”的所有用户撤销权限。超级用户或 User1 可以使用 CASCADE 选项为所有用户撤销对表 s1.t1 的 SELECT 权限。例如,超级用户或 User1 可以执行以下语句为链中的所有用户和角色撤销 SELECT 权限:

=> \c - User1
You are now connected as user "User1".
=> REVOKE SELECT ON s1.t1 FROM User2 CASCADE;
REVOKE PRIVILEGE

当超级用户或 User1 执行上述语句时,会为 User2、User3 和查看者角色撤销对表 s1.t1 的 SELECT 权限。同时也会为 User2 和 User3 撤销 GRANT 权限,超级用户可以通过查询 V_CATALOG.GRANTS 系统表进行验证。

=> SELECT * FROM grants WHERE object_name = 's1' AND grantee ILIKE 'User%';
 grantor | privileges_description | object_schema | object_name | grantee
---------+------------------------+---------------+-------------+---------
 dbadmin | USAGE                  |               | s1          | User1
 dbadmin | USAGE                  |               | s1          | User2
 dbadmin | USAGE                  |               | s1          | User3
(3 rows)

8 - 修改权限

超级用户或对象所有者可以使用其中一个 ALTER 语句修改权限,如更改序列所有者表所有者。重新分配给新所有者时,不会将授权从原始所有者转移到新所有者;由原始所有者所执行的授权会被删除。

9 - 查看为对象授予的权限

您可以通过查询以下系统表来查看有关权限、授予者、被授予者和对象的信息:

附加到权限后面的星号 (*) 表示用户可以将该权限授予其他用户。

您还可以使用 GET_PRIVILEGES_DESCRIPTION 元函数查看指定数据库对象的有效权限

查看显式授予的权限

若要查看显式授予的对象权限,请查询 GRANTS 表。

以下查询返回 myschema 架构的显式权限。

=> SELECT grantee, privileges_description FROM grants WHERE object_name='myschema';
 grantee | privileges_description
---------+------------------------
 Bob     | USAGE, CREATE
 Alice   | CREATE
 (2 rows)

查看继承的权限

若要查看哪些表和视图从哪些架构继承权限,请查询 INHERITING_OBJECTS 表。

以下查询返回从其父架构(客户)继承权限的表和视图。

=> SELECT * FROM inheriting_objects WHERE object_schema='customers';
     object_id     |     schema_id     | object_schema |  object_name  | object_type
-------------------+-------------------+---------------+---------------+-------------
 45035996273980908 | 45035996273980902 | customers     | cust_info     | table
 45035996273980984 | 45035996273980902 | customers     | shipping_info | table
 45035996273980980 | 45035996273980902 | customers     | cust_set      | view
 (3 rows)

若要查看表和视图继承的特定权限及其关联的授予语句的信息,请查询 INHERITED_PRIVILEGES 表。

以下查询返回表和视图从其父架构(客户)继承的权限。

=> SELECT object_schema,object_name,object_type,privileges_description,principal,grantor FROM inherited_privileges WHERE object_schema='customers';
 object_schema |  object_name  | object_type |                          privileges_description                           | principal | grantor
---------------+---------------+-------------+---------------------------------------------------------------------------+-----------+---------
 customers     | cust_info     | Table       | INSERT*, SELECT*, UPDATE*, DELETE*, ALTER*, REFERENCES*, DROP*, TRUNCATE* | dbadmin   | dbadmin
 customers     | shipping_info | Table       | INSERT*, SELECT*, UPDATE*, DELETE*, ALTER*, REFERENCES*, DROP*, TRUNCATE* | dbadmin   | dbadmin
 customers     | cust_set      | View        | SELECT*, ALTER*, DROP*                                                    | dbadmin   | dbadmin
 customers     | cust_info     | Table       | SELECT                                                                    | Val       | dbadmin
 customers     | shipping_info | Table       | SELECT                                                                    | Val       | dbadmin
 customers     | cust_set      | View        | SELECT                                                                    | Val       | dbadmin
 customers     | cust_info     | Table       | INSERT                                                                    | Pooja     | dbadmin
 customers     | shipping_info | Table       | INSERT                                                                    | Pooja     | dbadmin
 (8 rows)

查看对象的有效权限

若要查看当前用户对指定数据库对象的有效权限,请使用 GET_PRIVILEGES_DESCRIPTION 元函数。

在以下示例中,用户 Glenn 设置了 REPORTER 角色,并希望检查他对架构 s1 和表 s1.articles 的有效权限。

  • s1.articles 从其架构 (s1) 继承权限。

  • REPORTER 角色具有以下权限:

    • 对架构的 SELECT 权限 s1

    • 对表的 INSERT WITH GRANT OPTION 权限 s1.articles

  • 用户 Glenn 具有以下权限:

    • 对架构 s1 的 UPDATE 和 USAGE 权限。

    • 对表 s1.articles 的 DELETE 权限。

GET_PRIVILEGES_DESCRIPTION 返回 Glenn 对架构 s1 的以下有效权限:

=> SELECT GET_PRIVILEGES_DESCRIPTION('schema', 's1');
   GET_PRIVILEGES_DESCRIPTION
--------------------------------
 SELECT, UPDATE, USAGE
(1 row)

GET_PRIVILEGES_DESCRIPTION 返回 Glenn 对表 s1.articles 的以下有效权限:


=> SELECT GET_PRIVILEGES_DESCRIPTION('table', 's1.articles');
   GET_PRIVILEGES_DESCRIPTION
--------------------------------
 INSERT*, SELECT, UPDATE, DELETE
(1 row)

另请参阅