这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
授予和撤销权限
Vertica 支持通过 GRANT 和 REVOKE 语句(例如,GRANT(架构)和 REVOKE(架构)、GRANT(表)和 REVOKE(表) 等等)来控制用户对数据库对象的访问。通常,超级用户会在创建数据库后不久创建用户和角色,然后使用 GRANT 语句为所创建的用户和角色分配权限。
在适用的情况下,GRANT 语句需要对象架构的 USAGE 权限。以下用户可以授予和撤销权限:
在以下示例中,dbadmin(具有超级用户权限)创建用户 Carol
。随后的 GRANT 语句授予 Carol
架构和表权限:
=> 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
1 - 超级用户权限
Vertica 超级用户是在安装时自动创建的数据库用户(默认情况下,名为 dbadmin
)。Vertica 超级用户对数据库用户、权限和角色拥有完整且不可撤销的授权。
重要
Vertica 超级用户与具有 root 权限的 Linux 超级用户不同。
超级用户可以更改任何用户和角色的权限,并覆盖具有 PSEUDOSUPERUSER 角色的用户所授予的任何权限。他们还可以授予和撤销用户拥有的任何对象的权限,并重新分配对象所有权。
注意
超级用户始终代表对象所有者更改用户对对象的权限。因此,系统表
V_CATALOG.GRANTS 中的
grantor
设置始终显示对象所有者,而不是发出 GRANT 语句的超级用户。
加密权限
对于大多数编录对象,超级用户拥有所有可能的权限。但是,对于密钥、证书和 TLS 配置,超级用户在默认情况下只能获得 DROP 权限,并且必须由其所有者授予其他权限。有关详细信息,请参阅 GRANT(密钥)和
GRANT(TLS 配置)。
超级用户可以看到所存在的全部密钥、证书和 TLS 配置,但是,除非向他们授予 USAGE 权限,否则他们看不到密钥或证书的文本。
另请参阅
DBADMIN
2 - 架构所有者权限
通常情况下,架构所有者为创建该架构的用户。默认情况下,架构所有者有权在架构内创建对象。所有者还可以更改架构:重新分配所有权、重命名以及启用或禁用架构权限继承。
架构所有权不一定授予所有者对该架构中对象的访问权限。对象访问权限取决于向他们授予的权限。
所有其他用户和角色必须由所有者或超级用户显式授予对架构的访问权限。
3 - 对象所有者权限
数据库以及其中的每个对象都具有所有者。对象所有者通常是创建该对象的人员,但是超级用户可以更改对象(如表和序列)的所有权。
对象所有者必须具有合适的架构权限才能访问、更改、重命名、移动或删除其拥有的任何对象,而不需要任何额外的权限。
对象所有者还可以:
4 - 授予权限
如授予和撤销权限中所述,特定用户可使用带有或不带有可选 WITH GRANT OPTION 的 GRANT 语句授予权限,WITH GRANT OPTION 子句允许用户向其他用户授予相同的权限。
-
超级用户可向其他用户授予对所有对象类型的权限。
-
超级用户或对象所有者可向
角色授予权限。然后,被授予角色的用户会获得相应权限。
-
对象所有者可使用可选的 WITH GRANT OPTION 子句向其他用户授予对于对象的权限。
-
用户需要具有对架构的 USAGE 权限以及对于对象的相应权限。
当用户授予一个显式的权限列表时,例如 GRANT INSERT, DELETE, REFERENCES ON applog TO Bob
:
当用户授予 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 语句。
5 - 撤销权限
下面的非超级用户可以撤销对象的权限:
用户还必须具有对对象架构的 USAGE 权限。
例如,针对系统表 V_CATALOG.GRANTS
执行以下查询将显示用户 u1
、u2
和 u3
对架构 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)
注意
privileges_description
下权限上的星号 (*) 表示被授予者可以将这些权限授予其他用户。
在以下语句中,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
注意
REVOKE 语句必须包含 CASCADE,因为用户 u2
先前授予用户 u4
对表 s1.t1
的 INSERT 权限。当您撤销 u2
授予此权限的能力时,必须从其任何被授予者(在本例中为用户 u4
)中移除该权限。
您可以通过查询 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)
查询结果显示:
另请参阅
REVOKE(表)
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)