KingbaseES数据库权限简写说明
前言
为了方便,我们测试环境经常使用system用户执行测试,它拥有最高权限。
角色基本上是用户和组的概念。你可以以角色身份登录,并且一个角色可以属于另一个角色。每个角色都有一个类似的属性,指示你是否可以作为该角色登录,以及该角色是否从所属角色继承权限。你可以使用命令将角色添加到另一个角色的成员中。
一个KES数据库实例可以拥有多个数据库。一个数据库可以拥有多个模式。一个模式可以拥有多个表。
对象所有者
每个对象都有一个名为“所有者”的特殊角色。只有所有者才能执行某些操作,如 ALTER TABLE ,而不能将 GRANT 这样的权限授予非所有者。
a
你可能希望为一个对象分配两个以上的所有者。假设你有两个角色, app_user
和 sre_user
,你希望这两个用户都能运行 ALTER TABLE
命令,而只有所有者才能做到。由于每个对象只能有一个所有者,你不能直接让这两个用户都成为所有者。
你可以使用角色继承来解决此问题。创建 table_owner
角色和 GRANT table_owner TO app_user, sre_user
,然后像 ALTER TABLE my_table OWNER TO table_owner
那样转移所有者角色权限。现在表的所有者是 table_owner
,但是因为 app_user
和 sre_user
是该角色的成员,所以他们也具有继承权限来运行 ALTER TABLE
。
默认权限
当创建一个对象时,开始时只有所有者可以访问该对象。例如,如果你创建了一个新表,只有你可以访问该表,你需要单独向其他角色授权。这很麻烦,你每次创建新表时都需要这样做。有一个默认权限功能,允许你配置新创建的对象的默认权限。
假设你想要为数据库和模式下的所有新表默认分配只读权限给一个只读角色。但如果你想要将其限制在某个特定数据库,就不能使用这个角色。我们将通过使用默认权限为 ro_user
角色提供只读权限。
对于已创建的表,我们可以运行 GRANT SELECT ON ALL TABLES IN SCHEMA public TO ro_user
。这将为现有表 SELECT
权限。然而,我们希望将此权限授予将来创建的表。为了实现这一点, ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO ro_user
。这将改变默认权限。
请注意,这些默认权限仅在授权者创建新表时应用。例如,假设我们有两个所有者角色 table_owner1
和 table_owner2
。 table_owner1
发出 ALTER DEFAULT PRIVILEGES ...
,而另一个则没有默认权限。在这种情况下,发出的 ALTER DEFAULT PRIVILEGES
仅与 table_owner1
相关,并且仅在 table_owner1
创建新表时应用。即使 table_owner2
创建了一个新表,它也不会拥有由 table_owner1
定义的默认权限。
查看当前的ACL
通过使用 GRANT
和 REVOKE
命令,你可以修改ACL,但是我们如何查看当前的ACL呢?如果你使用 ksql
命令行界面,如下表,有一些命令行内部命令可以显示它们:
每个 ACL 条目都以缩写形式显示,看起来像arwdDxt
. 每个特权都缩短为一个字符。例如r
在arwdDxt
isSELECT
,w
is 中INSERT
。如下,可看到映射关系。
以下是一些权限查询的示例语句:
Object type | Query |
---|---|
DATABASE | SELECT datname, sys_catalog.sys_get_userbyid(datdba), datacl FROM sys_database; |
SCHEMA | SELECT nspname, sys_catalog.sys_get_userbyid(nspowner), nspacl FROM sys_namespace; |
TABLE | SELECT relname, relacl FROM sys_class WHERE relacl IS NOT NULL ; |