Greenplum的角色(用户)与权限管理(grant、revoke)

0    150    2

Tags:

👉 本文共约24355个字,系统预计阅读时间或需92分钟。

管理角色与权限

Greenplum数据库授权机制存储访问数据库中数据库对象的角色和权限, 并使用SQL语句或命令行实用程序进行管理。

Greenplum数据库使用roles管理数据库访问权限。角色的概念包含用户的概念。 一个角色可以是一个数据库用户、一个数据库组或者两者间距。角色可以拥有数据库对象(例如表),并可以将这些对象上的 权限赋予其他角色,依此来控制对对象的访问。 角色可以是其他角色的成员,因此成员角色可以继承其父角色的对象权限。

每个Greenplum数据库系统都包含一组数据库角色(用户和组)。这些角色与运行服务器的操作系统管理的用户和组相互独立。 但是,为方便起见,可能希望维护操作系统用户名和Greenplum数据库角色名之间的关系, 因为许多客户端应用程序使用当前操作系统用户名作为其默认值。

在Greenplum数据库中,用户通过master实例登录并连接, 然后master实例验证其角色和访问权限。 然后,master服务器以当前登录的角色的身份,将命令发布到幕后的segment实例。

角色在系统级别定义,这意味着它们对系统中的所有数据库都有效。

为了引导Greenplum数据库系统,新初始化的系统始终包含一个预定义的超级用户角色(也称为系统用户)。 该角色将与初始化Greenplum数据库系统的操作系统用户具有相同的名称。通常,此角色已命名为gpadmin。 为了创建更多角色,您首先必须以此初始角色进行连接。

角色和权限的安全最佳实践

  • 保护gpadmin系统用户 Greenplum需要UNIX用户标识来安装和初始化Greenplum数据库系统。 在Greenplum文档中,该系统用户称为gpadmin。 该gpadmin是Greenplum数据库中的默认数据库超级用户, 也是Greenplum安装文件系统及基础数据文件的所有者。 此默认管理员帐户是Greenplum数据库设计的基础。 没有它,系统无法运行,并且无法限制此gpadmin用户ID的访问权限。 针对特定目的,使用角色来管理谁有权访问数据库。 应该只在系统维护任务时使用gpadmin账户,如扩展和升级。 以此用户ID登录Greenplum主机的任何人都可以读取,更改或删除任何数据,包括系统目录数据和数据库访问权限。 因此,保护gpadmin用户ID并仅提供对基本系统管理员的访问权限非常重要。 管理员只应执行某些系统维护任务(如升级或扩展)时以gpadmin账户登录Greenplum。 数据库用户永远不应登录为gpadmin,ETL或生产工作永远不应该以gpadmin运行。
  • 为登录的每个用户分配不同的角色。为了记录和审计,允许每个允许登录Greenplum数据库的用户拥有自己的数据库角色。 对于应用程序或Web服务,考虑为每个应用程序或服务创建不同的角色。参阅创建新角色(用户)
  • 使用组来管理访问权限。参阅角色成员
  • 限制具有SUPERUSER角色属性的用户。 只有系统管理员才能获得超级用户权限。参阅变更角色属性

创建新角色(用户)

用户级角色被视为可以登录数据库并启动数据库会话的数据库角色。 因此,当你使用CREATE ROLE命令创建新的用户级角色时,必须指定LOGIN权限。例如:

数据库角色可以具有许多属性,这些属性定义角色可以在数据库中执行的任务类型。 可以在创建角色时设置这些属性,也可以稍后使用ALTER ROLE命令。 关于可以设置的角色属性的说明,参阅Table 1

变更角色属性

数据库角色可以具有许多属性,这些属性定义角色可以在数据库中执行的任务类型。

属性描述
SUPERUSER | NOSUPERUSER确定角色是否为超级用户。您必须自己是超级用户才能创建新的超级用户。默认值是NOSUPERUSER。
CREATEDB | NOCREATEDB确定是否允许角色创建数据库。 默认值是NOCREATEDB。
CREATEROLE | NOCREATEROLE确定是否允许角色创建和管理其他角色。 默认值是NOCREATEROLE。
INHERIT | NOINHERIT确定角色是否继承其所属角色的权限。 具有INHERIT属性的角色继承可以自动使用已授予其直接或间接成员的所有角色的任何数据库权限。 默认值是INHERIT。
LOGIN | NOLOGIN确定是否允许角色登录。 具有该LOGIN属性的角色可以被认为是用户。没有此属性的角色对于管理数据库权限(组)非常有用。 默认值是NOLOGIN。
CONNECTION LIMIT connlimit如果角色可以登录,则指定角色可以使用的并发连接数。默认值-1表示没有限制。
CREATEEXTTABLE | NOCREATEEXTTABLE确定是否允许角色创建外部表。 默认值是NOCREATEEXTTABLE。 具有该CREATEEXTTABLE属性的角色,默认外部表类型是可读的, 注意使用文件或执行的外部表只能由超级用户创建。
PASSWORD ‘password设置角色的密码。 如果您不打算使用密码身份验证,则可以省略此选项。 如果未指定密码,则密码将设置为空,并且该用户的密码验证将始终失败。 可以选择将空密码明确写为PASSWORD NULL。
ENCRYPTED | UNENCRYPTED控制是否将新密码在pg_authid系统目录中存储为哈希字符串。 如果没有指定ENCRYPTED,或者指定UNENCRYPTED, 则默认行为由password_encryption配置参数决定,该参数默认值为on。如果提供password字符串已经是哈希格式,无论是否指定ENCRYPTED或UNENCRYPTED都原样存储。有关保护登录密码的其他信息,参阅保护Greenplum数据库中的密码
VALID UNTIL ‘timestamp设置角色密码失效的日期和时间。如果省略,密码将始终有效。
RESOURCE QUEUE queue_name将角色分配给指定的资源队列以进行工作负载管理。 任何角色问题的声明都受资源队列限制的约束。 注意RESOURCE QUEUE属性不可继承; 必须为每个用户级别(LOGIN)角色分别设置。
DENY {deny_interval | deny_point}限制时间间隔期间的访问,按日期或日期时间指定。更多信息,参阅基于时间的身份验证

可以在创建角色时设置这些属性,也可在使用ALTER ROLE命令。例如:

因服务的特定设置,角色还可以具有特定于角色的默认值。例如,要为角色设置默认方案搜索路径:

角色成员

将用户组合在一起以便于管理对象权限通常很方便:这样,可以将权限授予整个组或从组中撤销。 在Greenplum数据库中,通过创建表示组的角色,然后将组角色的成员身份授予单个用户角色来完成的。

使用CREATE ROLE此SQL创建一个新的组角色。例如:

一旦组角色存在后, 可以使用GRANT和REVOKE命令,来添加和删除成员(用户角色)。例如:

为了管理对象权限,您只能为组级角色授予适当的权限(参阅Table 2)。 然后,成员用户角色将继承组角色的对象权限。例如:

角色属性LOGIN、SUPERUSER、CREATEDB、 CREATEROLE、CREATEEXTTABLE和RESOURCE QUEUE 永远不会像数据库对象上的普通权限那样被继承。 用户成员实际上必须SET ROLE具有这些属性的特定角色,才能使用该属性。 在上面的例子中,我们给出了CREATEDB和CREATEROLE到了admin角色。 如果sally是admin角色的成员,她可以发出以下命令来承担父角色的角色属性:

管理对象权限

当对象(表、视图、序列、数据库、函数、语言、模式或表空间)时,会为其分配一个所有者。 所有者通常是执行创建语句的角色。 对于大多数类型的对象,初始状态是只有所有者(或超级用户)可以对该对象执行任何操作。 要允许其他角色使用它,必须授予权限。 Greenplum Database支持每种对象类型的以下权限:

对象类型权限
表、视图、序列SELECT INSERT UPDATE DELETE RULE ALL
外部表SELECT RULE ALL
数据库CONNECT CREATE TEMPORARY | TEMP ALL
函数EXECUTE
过程语言USAGE
模式CREATE USAGE ALL
自定义协议SELECT INSERT UPDATE DELETE RULE ALL

Note: 您必须单独为每个对象授予权限。 例如,授予数据库上ALL权限,并不授予对该数据库中的对象的完全访问权限。 它只授予数据库级别的(CONNECT、CREATE、TEMPORARY)到数据库本身的权限。

使用GRANT此SQL命令为对象赋予指定的角色权限。 例如,要授予名为jsmith的角色在名为mytable的表上插入权限:

同样,授予jsmith仅为名为table2表中的名为col1的查询权限,表2:

要撤消权限,使用REVOKE命令。例如:

也可以使用DROP OWNED和REASSIGN OWNED命令 用于管理已弃用角色所拥有的对象(注意:只有对象的所有者或超级用户才能删除对象或重新分配所有权)。例如:

模拟行级访问控制

Greenplum数据库不支持行级访问或行级标记的安全性。 可以使用视图来限制所选行的行来模拟行级访问。 可以通过向表中添加额外的列来存储敏感度信息, 然后使用视图来控制基于此列的行级访问来模拟行级标签。 然后,可以授予角色访问视图而不是基本表的权限。

加密数据

Greenplum数据库安装了一个可选的加密解密函数模块pgcrypto。 该pgcrypto函数允许数据库管理员以加密形式存储某些数据列。 这为敏感数据增加了额外的保护层, 没有加密密钥,任何人都无法读取以加密形式存储在Greenplum数据库中的数据,也无法直接从磁盘读取数据。

Note: 该pgcrypto数据库服务器内运行,这意味着在pgcrypto和客户端应用程序之间, 所有数据和密码以明文形式移动。为获得最佳安全性,还应考虑在客户端和Greenplum主服务器之间使用SSL连接。

要使用pgcrypto函数,在每个要使用此函数的数据库中,注册pgcrypto扩展。例如:

有关各个函数的更多信息,参阅PostgreSQL文档中的pgcrypto

保护Greenplum数据库中的密码

在其默认配置中,Greenplum Database以MD5哈希值形式, 将登录用户密码保存在pg_authid系统目录, 而不是保存明文密码。 任何能够查看此pg_authid表的人都可以看到哈希字符串,但没有密码。 这还可确保在将数据库转储到备份文件时隐藏密码。

使用以下任何命令设置密码时执行哈希函数

  • CREATE USER name WITH ENCRYPTED PASSWORD ‘password’
  • CREATE ROLE name WITH LOGIN ENCRYPTED PASSWORD ‘password’
  • ALTER USER name WITH ENCRYPTED PASSWORD ‘password’
  • ALTER ROLE name WITH ENCRYPTED PASSWORD ‘password’

当password_encryption系统配置参数为on(这是默认值)时, ENCRYPTED关键字可以被省略。 当命令未指定ENCRYPTED或UNENCRYPTED时, password_encryption配置参数决定是存储明文密码还是哈希密码。

Note: SQL命令语法和password_encryption配置变量,包括术语加密。 但是密码在技术上并不是加密。它们是被哈希,因此无法解密。

哈希是在通过将明文密码和角色名称串起来,然后计算的。 MD5哈希生成一个前缀为md5字符的32字节十六进制字符串。 哈希密码保存在pg_authid系统表rolpassword的列。

尽管不被推荐,但密码可以以明文形式保存在数据库中,通过UNENCRYPTED命令关键词, 或者将password_encryption配置变量参数设置为off。 注意,更改配置值不会影响现有密码,只会影响新创建或更新的密码。

要全局地设置password_encryption,在命令行中使用gpadmin用户执行这些命令:

要在会话中设置password_encryption,使用SQL的SET命令。例如:

密码可以使用SHA-256哈希算法而不是默认的MD5哈希算法进行哈希。 该算法生成一个前缀为sha256字符的64字节十六进制字符串。

Note:

虽然SHA-256使用更强的加密算法并生成更长的哈希字符串,但它不能被用于MD5认证方法。 要使用SHA-256密码哈希,必须在pg_hba.conf配置文件中,将认证方法设置为password, 以便明文密码被发送给Greenplum数据库。 由于明文密码是通过网络发送的,因此在使用SHA-256时使用SSL进行客户端连接非常重要。 另一方面,默认md5认证方法, 身份验证方法在将密码发送到Greenplum数据库之前对密码进行两次哈希处理。 一次是在密码和角色名称上,然后再次在客户端和服务器之间共享盐值,因此明文密码永远不会发送到网络。

要启用SHA-256哈希,更改password_hash_algorithm配置参数的默认值从md5为sha-256。 该参数可以全局设置或在会话级别设置。要全局地设置password_hash_algorithm,在命令行中使用gpadmin用户执行这些命令:

要全局地设置password_hash_algorithm,SQL的SET命令。例如:

基于时间的身份验证

Greenplum数据库使管理员可以按角色限制对特定时间的访问。 使用CREATE ROLE或ALTER ROLE命令,指定基于时间的约束。

有关详细信息,参阅Greenplum数据库安全配置指南.

配置数据库授权

描述如何通过使用角色和权限在用户级别限制对数据库数据的授权访问。

访问权限和角色

Greenplum数据库使用角色管理数据库访问权限。角色的概念包括了用户和组的概念。一个角色可以是一个数据库用户、组或者两者皆有。角色可以拥有数据库对象(例如表)并且可以把那些对象上的特权指派给其他角色以控制对那些对象的访问。角色可以是其他角色的成员,因此成员角色可以继承其父角色的对象特权。

每一个Greenplum数据库系统都包含一组数据库角色(用户和组)。那些角色独立于服务器所运行的操作系统管理的用户和组。不过,为了方便用户可能想要维护操作系统用户名和Greenplum数据库角色名之间的关系,因为很多客户端应用使用当前的操作系统用户名作为默认的数据库用户名。

在Greenplum数据库中,用户通过Master实例登入和连接,Master实例会验证它们的角色和访问特权。然后Master将在幕后用当前登入的角色向Segment实例发出命令。

角色被定义在系统层面上,因此它们对系统中的所有数据库都有效。

要让Greenplum数据库系统自举,刚刚初始化好的系统总是包含一个预定义的超级用户角色(也被称作系统该用户)。这个角色将和初始化Greenplum数据库系统的操作系统用户具有相同的名称。习惯上,这个角色被命名为gpadmin。要创建更多角色,用户首先必须作为这个初始角色连接。

管理对象特权

当一个对象(表、视图、序列、数据库、函数、语言、方案或表空间)被创建时,它会被指派一个拥有者。拥有者通常就是执行创建语句的角色。对于大部分种类的对象,初始状态只有拥有者(或者超级用户)可以对该对象做任何事情。要允许其他角色使用对象,必须授予特权。对每一类对象,Greenplum数据库支持下面的特权:

对象类型特权
表、视图、序列SELECT、INSERT、UPDATE、DELETE、RULE、ALL
外部表SELECT、RULE、ALL
数据库CONNECT、CREATE、TEMPORARY | TEMP、ALL
函数EXECUTE
Procedural LanguagesUSAGE
方案CREATE、USAGE、ALL

特权必须为每个对象单独授予。例如,在一个数据库上授予ALL并不会为该数据库中的对象授予完全的访问。它只授予所有的数据库级别特权(CONNECT, CREATE, TEMPORARY)给数据库本身。

使用SQL命令GRANT把对象上的特权给一个特定角色。例如:

T要收回特权,可使用REVOKE命令。例如:

用户还可以使用DROP OWNED以及REASSIGN OWNED命令来管理弃用角色所拥有的对象(注意:只有对象的拥有者或者超级用户可以删除一个对象或者重新指派拥有关系)。例如:

使用SHA-256加密

Greenplum数据库的访问控制大概能对应桔皮书的“C2”级安全性,而不是“B1”级。Greenplum数据库当前支持对象级别的访问特权。行级或者列级访问不被支持,标记安全性也不被支持。

行级和列级访问可以使用限制被选择的行列的视图来模拟。行级标签可以通过为表增加存储敏感度信息的额外列模拟,然后使用视图来控制基于该列的行级访问。然后可以为角色授予对视图的访问而不是对基表的访问。虽然这些变通方案不能提供和“B1”级安全性相同的安全性,但对于很多组织来说它们仍然是一种可行的替代方案。

要使用SHA-256加密,用户必须在系统或者会话级别上设置一个参数。这一节介绍如何使用一个服务器参数来实现SHA-256加密的口令存储。注意为了使用SHA-256加密进行存储,客户端认证方法必须被设置为password而不是默认的MD5(详见 配置SSL客户端连接)。这意味着口令在网络上以明文方式传输,因此我们高度推荐用户设置SSL来加密客户端和服务器之间的通信信道。

用户可以在系统范围或者以会话为基础设置选择的加密方法。可用的加密方法是SHA-256以及MD5(为了向后兼容性)。

在系统范围设置加密方法

要在整个Greenplum系统(Master及其Segment)上设置password_hash_algorithm服务器参数:

  1. 作为超级用户登入Greenplum数据库实例。

  2. 执行gpconfig把password_hash_algorithm设置为SHA-256:

  3. 验证设置:

    将看到:

为单个会话设置加密方法

要为单个会话设置password_hash_algorithm服务器参数:

  1. 作为超级用户登入Greenplum数据库实例。

  2. 设置password_hash_algorithm为SHA-256:

  3. 验证设置:

    将会看到:

下面是展示新设置效果的例子:

  1. 作为超级用户登入并且验证口令哈希算法设置:

  2. 创建一个带有口令且有登录特权的新角色。

  3. 更改客户端认证方法以允许SHA-256加密口令的存储:

    在Master上打开pg_hba.conf文件并且加入下面的行:

  4. 重启集群。

  5. 作为刚创建好的用户testdb登入数据库。

  6. 在提示下输入正确的口令。

  7. 验证口令被存储为SHA-256哈希。

    口令的哈希被存储在pg_authid.rolpasswod中。

  8. 作为超级用户登入。

  9. 执行下列查询:

用时间限制访问

Greenplum数据库让管理员能够限制角色在特定时间的访问。可使用CREATE ROLE或者ALTER ROLE命令指定基于时间的约束。

可以用日期或者日期和时间限制访问。无需删除和重建角色就可以移除这些约束。

基于时间的约束只适用于它们指派给的角色。如果角色是另一个有时间约束的角色的成员,时间约束不会被继承。

基于时间的约束仅在登录时被实施。SET ROLE以及SET SESSION AUTHORIZATION命令不受任何基于时间的约束的影响。

要为角色设置基于时间的约束,要求超级用户或者CREATEROLE特权。没有人可以为超级用户增加基于时间的约束。

有两种方法增加基于时间的约束。在CREATE ROLE或者ALTER ROLE命令中使用关键词DENY,后面接上下面的一种形式:。

  • 访问被限制的一个日子,以及可选的时间。例如,在周三不能访问。
  • 一个区间——也就是一个开始日期和结束日期以及可选的时间——在其间访问被限制。例如,从周三下午10点到周四上午8点期间不能访问。

用户可以指定多个限制,例如,周三的任何时间都不能访问并且在周五的下午3点到5点之间不能访问。

有两种方法指定一个日子。使用后面跟着带单引号的英语中平日术语的DAY或者0到6之间的一个数字,如下表所示。

英语术语数字
DAY ‘Sunday’DAY 0
DAY ‘Monday’DAY 1
DAY ‘Tuesday’DAY 2
DAY ‘Wednesday’DAY 3
DAY ‘Thursday’DAY 4
DAY ‘Friday’DAY 5
DAY ‘Saturday’DAY 6

日子中的时间可以以12小时制或者24小时制指定。在词TIME后面接上带单引号的说明。只能指定小时和分钟并且用分号分隔(:)。如果使用12小时制,在最后加上AM或者PM。下面的例子展示了多种时间说明。

Important: 基于时间的约束根据服务器时间实施。不考虑时区。

要指定一个时间区间,在其间访问被禁止,可以用词BETWEEN和AND指定两个日子/时间说明。如下所示。DAY总是需要的。

最后三个语句等效。

Note: 区间不能在周六之后回卷。

下面的语法不正确:

正确的说明是使用两个DENY子句,如下所示:

下面的例子展示了创建带有基于时间约束的角色并且修改角色以增加基于时间的约束。只有基于时间约束所需的语句被显示。更多有关创建和修改角色的细节请见 Greenplum数据库参考指南中CREATE ROLE 和 ALTER ROLE的描述。

例 1 – 创建带有基于时间约束的新角色

在周末不允许访问。

例 2 – 修改角色以增加基于时间的约束

每晚的凌晨2点到4点之间不允许访问。

例 3 – 修改角色以增加基于时间的约束

在周三或者周五下午的3点到5点间不允许访问。

删除基于时间的约束

要移除基于时间的约束,请使用ALTER ROLE命令。输入后面跟着要删除的日子/时间说明的关键词DROP DENY FOR。

任何含有DROP子句中全部或者部分条件的约束都会被移除。例如,如果一条现有的约束否定周一和周二的访问,并且DROP子句移除周一的约束,则这一条现有的约束会被完全删除。DROP子句会完全移除所有与DROP子句中约束交叠的约束。即便发生交叠的约束包含有比DROP子句更多的限制,它们也会被完全删除。

例 1 - 从一个角色移除一条基于时间的限制

这个语句将为例2中的generaluser角色移除所有与周一约束交叠的约束,即便其中有额外的约束。

CREATE ROLE

定义一个新的数据库角色(用户或组)。

概要

其中option可以是:

描述

CREATE ROLE在Greenplum数据库系统中添加了新角色。 角色是可以拥有数据库对象并具有数据库特权的实体。 根据角色的使用方式,可以将角色视为用户,组或两者。 您必须具有CREATEROLE特权或是数据库超级用户才能使用此命令。

请注意,角色是在系统级别定义的,并且对于Greenplum数据库系统中的所有数据库均有效。

参数

name

新角色的名称。

SUPERUSER

NOSUPERUSER

如果指定了SUPERUSER,则定义的角色将是超级用户,该超级用户可以覆盖数据库中的所有访问限制。 超级用户状态很危险,应仅在真正需要时使用。 您必须自己是超级用户才能创建新的超级用户。 默认值为NOSUPERUSER。

CREATEDB

NOCREATEDB

如果指定了CREATEDB,将允许所定义的角色创建新数据库。 NOCREATEDB(默认值)将使角色无法创建数据库。

CREATEROLE

NOCREATEROLE

如果指定了CREATEROLE,则允许定义的角色创建新角色,更改其他角色和删除其他角色。 NOCREATEROLE(默认值)将拒绝角色创建新角色或修改其他角色。

CREATEUSER

NOCREATEUSER

这些子句已经过时,但仍然被SUPERUSER和NOSUPERUSER的拼写接受。 请注意,它们不等同于CREATEROLE和NOCREATEROLE子句。

CREATEEXTTABLE

NOCREATEEXTTABLE

如果指定了CREATEEXTTABLE,则允许定义的角色创建外部表。 如果未指定,则默认type为readable,默认protocol为gpfdist。 有效类型为gpfdist,gpfdists,http和https。 NOCREATEEXTTABLE(默认类型)拒绝该角色创建外部表。 请注意,使用file或execute协议的外部表只能由超级用户创建。

使用GRANT…ON PROTOCOL命令允许用户创建和使用具有自定义协议类型的外部表, 包括Greenplum数据库附带的s3和pxf协议。

INHERIT

NOINHERIT

如果指定了该属性,则INHERIT(默认设置)允许该角色使用为其直接或间接所属的所有角色授予的任何数据库特权。 使用NOINHERIT时,另一个角色的成员资格仅授予SET ROLE权限给该另一个角色。

LOGIN

NOLOGIN

如果指定,则LOGIN允许角色登录数据库。 可以将具有LOGIN属性的角色视为用户。 具有NOLOGIN的角色对于管理数据库特权很有用,并且可以视为组。 如果未指定,则NOLOGIN为默认值, 除非CREATE ROLE通过其替代拼写CREATE USER被调用时。

REPLICATION

NOREPLICATION

这些子句确定是允许角色启动流复制还是使系统进入和退出备份模式。 具有REPLICATION属性的角色是具有很高特权的角色,并且仅应在实际用于复制的角色上使用。 如果未指定,则NOREPLICATION是默认值。

CONNECTION LIMIT connlimit

此角色可以建立的并发连接的最大数量。默认值-1表示没有限制。

PASSWORD password

使用LOGIN属性设置角色的用户密码。 如果您不打算使用密码身份验证,则可以忽略此选项。 如果未指定密码,则密码将设置为null,并且该用户的密码身份验证将始终失败。 空密码可以有选择地显式写为PASSWORD NULL。

ENCRYPTED

UNENCRYPTED

这些关键字控制密码是否以加密方式存储在系统catalog中。 (如果未指定,则默认行为由配置参数password_encryption决定。) 如果显示的密码字符串已经采用MD5加密格式,则将按原样存储加密, 而不管是否指定了ENCRYPTED或UNENCRYPTED(因为系统无法解密指定的加密密码字符串)。 这允许在转储/还原期间重新加载加密的密码。

VALID UNTIL ‘timestamp’

VALID UNTIL子句设置日期和时间,之后该角色的密码将不再有效。 如果省略此子句,密码将永不过期。

IN ROLE rolename

将新角色添加为命名角色的成员。 请注意,没有任何选项可以将新角色添加为管理员。 使用单独的GRANT命令来执行此操作。

ROLE rolename

将命名角色添加为该角色的成员,从而使该新角色成为一个组。

ADMIN rolename

ADMIN子句类似于ROLE, 但是被提及的角色被使用WITH ADMIN OPTION加入到新角色中, 从而赋予他们将这个角色的成员资格授予其他人的权利。

RESOURCE GROUP group_name

要分配给新角色的资源组的名称。 该角色将受限于资源组配置的并发事务,内存和CPU限制。 您可以将一个资源组分配给一个或多个角色。

如果未为新角色指定资源组,则会自动为该角色分配角色的默认资源组, 为SUPERUSER角色分配admin_group, 为非管理员角色分配default_group。

您可以将admin_group资源组分配给具有SUPERUSER属性的任何角色。

您可以将default_group资源组分配给任何角色。

您不能将为外部组件创建的资源组分配给角色。

RESOURCE QUEUE queue_name

新用户级别角色将分配到的资源队列的名称。 只能将具有LOGIN特权的角色分配给资源队列。 特殊关键字NONE表示将角色分配给默认资源队列。 一个角色只能属于一个资源队列。

具有SUPERUSER属性的角色不受资源队列限制。 对于超级用户角色,无论分配的资源队列施加什么限制,查询总是立即运行。

DENY deny_point

DENY BETWEEN deny_point AND deny_point

DENY和DENY BETWEEN关键字设置在登录时强制执行的基于时间的约束。 DENY设置拒绝访问的日期或日期和时间。 DENY BETWEEN设置一个拒绝访问的时间间隔。 两者都使用具有以下格式的参数deny_point:

deny_point参数的两个部分使用以下格式:

对于day:

对于time:

DENY BETWEEN子句使用两个deny_point参数:

有关基于时间的约束的更多信息和示例,请参阅Greenplum数据库管理员指南中的“管理角色和特权”。

注解

添加和删除角色成员(管理组)的首选方法是使用GRANTREVOKE

VALID UNTIL子句仅为密码而不是角色定义过期时间。 使用非基于密码的身份验证方法登录时,不会强制使用到期时间。

INHERIT属性控制可授予特权(数据库对象和角色成员的访问特权)的继承。 它不适用于由CREATE ROLE和ALTER ROLE设置的特殊角色属性。 例如,即使设置了INHERIT,具有CREATEDB特权的角色成员也不会立即授予创建数据库的能力。 这些特权/属性永远不会被继承: SUPERUSER,CREATEDB,CREATEROLE, CREATEEXTTABLE,LOGIN,RESOURCE GROUP和RESOURCE QUEUE。 必须在每个用户级角色上设置属性。

由于向后兼容,INHERIT属性是默认属性。 在以前的Greenplum数据库版本中,用户始终可以访问其所属组的所有特权。 但是,NOINHERIT提供与SQL标准中指定的语义更接近的匹配。

使用CREATEROLE特权时要小心。 对于CREATEROLE-role的特权,没有继承的概念。 这意味着,即使一个角色没有特定的特权,但被允许创建其他角色, 它也可以轻松地创建另一个角色,而该角色的特权不同于其自己的角色(创建具有超级用户特权的角色除外)。 例如,如果角色具有CREATEROLE特权,但没有CREATEDB特权,则它可以使用CREATEDB特权创建新角色。 因此,将具有CREATEROLE特权的角色视为几乎超级用户角色。

超级用户绝不执行CONNECTION LIMIT选项。

使用此命令指定未加密的密码时必须小心。 密码将以明文形式传输到服务器,并且也可能会记录在客户端的命令历史记录或服务器日志中。 但是,客户端程序createuser传输加密的密码。 另外,psql包含命令\password,可用于稍后安全地更改密码。

示例

创建一个可以登录但不提供密码的角色:

创建一个属于资源队列的角色:

使用有效期至2016年底的密码创建角色 (CREATE USER与CREATE ROLE相同,只不过它暗含了LOGIN):

创建一个可以创建数据库并管理其他角色的角色:

创建一个角色,该角色在星期日不允许登录访问:

创建一个可以创建类型为’gpfdist’的可读可写外部表的角色:

创建一个角色,分配一个资源组:

兼容性

SQL标准定义了用户和角色的概念,但是将它们视为不同的概念,并将所有定义用户的命令留给数据库实现指定。 在Greenplum数据库中,用户和角色被统一为单一类型的对象。 因此,角色具有比标准中更多的可选属性。

CREATE ROLE在SQL标准中,但是该标准仅需要以下语法:

Greenplum数据库扩展是允许多个初始管理员,以及CREATE ROLE的所有其他选项。

通过为用户提供NOINHERIT属性, 而为角色赋予INHERIT属性,可以最接近地逼近SQL标准指定的行为。

ALTER ROLE

更改一个数据库角色(用户或组)。

概要

描述

ALTER ROLE更改Greenplum数据库角色的属性。此命令有几种变体

WITH option

修改可以在CREATE ROLE中指定的大多数角色属性。 (包含了所有可能的属性,但不包括添加或删除成员身份的选项;为那些选项使用 GRANTREVOKE 。) 在这个命令中没提到 的属性将保留她们原来的值。超级用户可以为任何角色修改任何设置。 拥有 CREATEROLE 权限的角色可以修改任意的这些设置,但是仅限于非超级用户 和非replication角色。 普通用户只可以修改自己的密码。

RENAME

更改角色的名称。数据库超级用户可以重命名任何角色。角色有 CREATEROLE 特权 可以重命名非超级用户角色。无法重命名当前会话用户(以其他用户身份连接重命名角色)。 因为MD5加密的密码使用角色名称作为密钥,如果密码为MD5加密,则重命名角色将清除其密码。

SET | RESET

为指定的配置参数更改角色的会话默认值, 对于所有数据库,或者在IN DATABASE子句指定数据库时,仅对命名数据库中的会话 进行更改。如果指定了all而不是角色名,则会更改所有角色的设置。在IN DATABASE 使用ALL实际上与使用命令ALTER DATABASE…SET…一样。

每当角色随后启动新会话时,指定的值将成为会话默认值,覆盖服务器配置文件 (postgresql.conf)中存在的,或从postgres命令行接收到的任何设置。 这只会发生在登录时,执行SET ROLE 或者 SET SESSION AUTHORIZATION 不会触发设置新的值

附加到角色的数据库特定设置将覆盖所有数据库的设置。特定数据库或特定角色的设置将覆盖所有角色的设置。

对于没有LOGIN权限的角色,会话默认值无效。普通角色可以更改自己的会话默认值。超级用户可以更改任何人的会话默认值。具有CREATEROLE权限的角色可以更改非超级用户角色的默认值。普通角色只能为自己设置默认值。某些配置变量不能这样设置,或者只能在超级用户发出命令时设置。有关所有用户可设置配置参数的信息,请参阅Greenplum数据库参考指南。只有超级用户才能更改所有数据库中所有角色的设置。

RESOURCE QUEUE

将角色分配给工作负载管理资源队列。 在发出查询时,角色将受到分配资源队列的限制。指定NONE将角色分配给默认资源队列。一个角色只能属于一个资源队列。对于没有LOGIN特权的角色,会话默认值没有任何作用。 参考CREATE RESOURCE QUEUE 获取更多信息。

RESOURCE GROUP

为角色分配资源组。然后,角色将受制于为资源组配置的并发事务、内存和CPU限制。可以将单个资源组分配给一个或多个角色。不能将为外部组件创建的资源组分配给角色。参考CREATE RESOURCE GROUP获取更多信息。

参数

name

将被修改属性的角色名。

new_name

该角色的新名称。

database_name

将要设置配置参数的数据库名。

config_parameter=value

将指定配置参数的此角色会话默认值设置为给定值。如果 value是DEFAULT 指或者指定 RESET ,则角色的指定参数设置会被删除,角色将在新会话里面继承系统层面的默认值,使用RESET ALL 可以清除所有的角色特殊配置。 SET FROM CURRENT 保存会话的当前参数值作为角色指定的值。如果指定了IN DATABASE ,则只会为指定的角色数据库。当随后角色 开启新的会话时,指定的参数值成为会话的默认值,覆盖服务器配置文件(postgresql.conf)中存在的,或从 postgres命令行接收到的任何设置。

角色指定的变量设置只会在登录时生效; SET ROLE 和 SET SESSION AUTHORIZATION不会处理指定角色的变量设置。

参阅 服务器配置参数 来获取更多关于用户可设置参数的信息。

group_name

分配给该角色的资源组名称。指定group_name为 NONE 删除角色当前分配的资源组,基于角色的能力分配一个默认资源组。 SUPERUSER 角色分配 admin_group 资源组,而default_group 资源组则分配给非admin 角色。

不能将为外部组件创建的资源组分配给角色。

queue_name

要分配用户级角色的资源队列的名称。 只有LOGIN特权的角色 可以分配给资源队列。要从资源队列中取消分配角色并将其置于默认资源队列中, 请指定NONE。 角色只能属于一个资源队列。

SUPERUSER | NOSUPERUSER

CREATEDB | NOCREATEDB

CREATEROLE | NOCREATEROLE

CREATEUSER | NOCREATEUSER

CREATEUSER 和 NOCREATEUSER 已经过期,但是 仍被接受为SUPERUSER和 NOSUPERUSER。注意,它们 不等同于CREATEROLE and和NOCREATEROLE子句。

CREATEEXTTABLE | NOCREATEEXTTABLE [(attribute=’value’)]

如果CREATEEXTTABLE 被指定, 允许定义的角色创建外部表。如果没 被指定,默认类型是readable,并且默认协议 是gpfdist。 NOCREATEEXTTABLE(默认)拒绝角色有创建外部表的能力。 注意使用的外部表file或execute协议只能由超级用户创建。

INHERIT | NOINHERIT

LOGIN | NOLOGIN

REPLICATION

NOREPLICATION

CONNECTION LIMIT connlimit

PASSWORD password

ENCRYPTED | UNENCRYPTED

VALID UNTIL ‘timestamp’

这些子句通过CREATE ROLE改变了原来设置的角色属性。

DENY deny_point

DENY BETWEEN deny_point AND deny_point

DENY和DENY BETWEEN关键字设置了在登录时强制执行的基于时间的约束。DENY设置一天或一天的时间来拒绝访问。DENY BETWEEN设置访问被拒绝的间隔。 两者都使用以下格式的参数deny_point :

deny_point两部分参数使用以下格式::

对于 day:

对于time:

{ 00-23 : 00-59 | 01-12 : 00-59 { AM | PM }}

DENY BETWEEN子句使用两种deny_point参数。

有关基于时间的约束和示例的更多信息,参阅Greenplum数据库管理员指南中的“管理角色和特权”。

DROP DENY FOR deny_point

该DROP DENY FOR子句从角色中删除基于时间的约束。它使用上述的deny_point参数。

有关基于时间的约束和示例的更多信息,参阅Greenplum数据库管理员指南中的“管理角色和特权”。

注意

使用 CREATE ROLE 新增角色, 使用DROP ROLE 删除角色。

使用 GRANTREVOKE 来增加和删除角色成员。

使用此命令指定未加密的密码时,必须小心。密码将以明文形式发送到服务器,也可能会记录在客户端的命令历史记录或服务器日志中。 该 psql命令行客户端包含一个元命令\password可用于安全地更改角色的密码。

还可以将会话默认值与特定数据库而不是角色绑定。如果存在冲突,则特定于角色的设置将覆盖数据库特定的设置。参阅 ALTER DATABASE

示例

更改角色的密码:

删除角色的密码:

更改密码失效日期:

使密码永久有效:

赋予角色创建其他角色和新数据库的能力:

给角色一个非默认设置maintenance_work_mem参数:

给角色一个非默认,指定数据库的参数client_min_messages 值:

将角色分配给资源队列:

授予创建可写外部表的角色权限:

更改角色在星期日不允许登录访问:

改变角色以消除星期日不允许登录访问的约束:

指定一个新的资源组给角色:

兼容性

ALTER ROLE 语句是 Greenplum 数据库的扩展

GRANT

定义访问权限。

概要

描述

Greenplum数据库将用户和组的概念统一为一种称为角色的实体。 因此,不必使用关键字GROUP来标识被授予者是用户还是组。 命令中仍然允许使用GROUP,但这是一个干扰词。

GRANT命令具有两种基本变体: 一种对数据库对象(表,列,视图,外部表,序列,数据库,外部数据包装器,外部服务器,函数,过程语言,模式或表空间)授予特权, 以及授予一个角色中的成员关系。

数据库对象上的*GRANT*

GRANT命令的此变体将一个数据库对象的特定特权授予一个或多个角色。 这些特权将添加到已授予的特权(如果有)中。

还有一个选项可以授予一个或多个模式中所有相同类型的对象的特权。 当前仅表,序列和函数支持此功能(但请注意,ALL TABLES被视为包括视图和外部表)。

关键字PUBLIC表示将特权授予所有角色,包括以后可能创建的角色。 可以将PUBLIC视为始终包含所有角色的隐式定义的组级别角色。 任何特定角色将具有直接授予它的特权,授予它当前所属的任何角色的特权以及授予PUBLIC的特权的总和。

如果指定了WITH GRANT OPTION,则特权的接收者可以依次将其授予其他人。 没有grant option,接收者将无法做到这一点。 Grant options不能授予PUBLIC。

无需向对象的所有者(通常是创建该对象的角色)授予特权,因为所有者默认情况下具有所有特权。 (但是,所有者可以出于安全考虑选择撤销自己的某些特权。)

删除对象或以任何方式更改其定义的权利不视为可授予的特权;它是所有者固有的,不能被授予或撤销。 (但是,通过授予或撤消拥有对象的角色的成员资格,可以获得类似的效果;请参阅下文。) 所有者也隐式拥有该对象的所有授予选项。

Greenplum数据库将某些类型的对象的默认特权授予PUBLIC。 默认情况下,不将在表,表列,序列,外部数据包装器,外部服务器,大型对象,模式或表空间上的权限授予PUBLIC。 对于其他类型的对象,授予PUBLIC的默认特权如下:

  • 数据库的CONNECT和TEMPORARY(创建临时表)特权,
  • 函数的EXECUTE特权
  • 语言和数据类型(包括域)的USAGE特权。

当然,对象所有者可以REVOKE默认特权和明确授予的特权。 (为了获得最大的安全性,请在创建对象的同一事务中执行REVOKE;因此,没有任何时间窗口可供其他用户使用该对象。)

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

角色上的*GRANT*

GRANT命令的此变体将一个角色的成员资格授予一个或多个其他角色。 角色的成员资格意义重大,因为它可以将授予角色的特权传达给每个成员。

如果指定了WITH ADMIN OPTION,则成员可以依次将角色的成员资格授予其他人,也可以撤消该角色的成员资格。 没有admin选项,普通用户将无法做到这一点。 角色不被认为拥有WITH ADMIN OPTION本身,但是它可以从会话用户与角色匹配的数据库会话中授予或撤销成员资格。 数据库超级用户可以以任何角色向任何人授予或撤销成员资格。 具有CREATEROLE特权的角色可以授予或撤消不是超级用户的任何角色的成员资格。

与具有特权的情况不同,不能将角色的成员资格授予PUBLIC。

协议上的*GRANT*

您还可以使用GRANT命令指定哪些用户可以访问受信任的协议。 (如果该协议不受信任,则您不能授予任何其他用户权限以使用它来读取或写入数据。)

  • 要允许用户使用受信任的协议创建可读的外部表:

  • 要允许用户使用受信任的协议创建可写外部表:

  • 要允许用户使用受信任的协议创建可读和可写的外部表:

您还可以使用此命令来授予用户创建和使用s3和pxf外部表的权限。 但是,类型为http,https,gpfdist和gpfdists的外部表是在Greenplum数据库内部实现的,而不是作为自定义协议来实现的。 对于这些类型,请使用CREATE ROLE或ALTER ROLE命令为每个用户设置CREATEEXTTABLE或NOCREATEEXTTABLE属性。 有关语法和示例,请参见CREATE ROLE

参数

SELECT

允许从指定表,视图或序列的任何列或列出的特定列中进行SELECT。 还允许使用COPY TO。 引用UPDATE或DELETE中现有的列值也需要此特权。

INSERT

允许将新行INSERT到指定表中。 如果列出了特定的列,则只能在INSERT命令中指定那些列(其他列将接收默认值)。 还允许COPY FROM。

UPDATE

允许UPDATE指定表的任何列或列出的特定列。 SELECT … FOR UPDATE和SELECT … FOR SHARE在至少一列上也需要此特权(以及SELECT特权)。 对于序列,此特权允许使用nextval()和setval()函数。

DELETE

允许从指定表中DELETE一行。

REFERENCES

尽管Greenplum数据库当前不支持外键约束,但仍可接受此关键字。 要创建外键约束,必须在引用列和被引用列上都具有此特权。 可以为表的所有列或仅特定列授予特权。

TRIGGER

允许在指定的表上创建触发器。

Note: Greenplum数据库不支持触发器。

TRUNCATE

允许对指定表中的所有行进行TRUNCATE。

CREATE

对于数据库,允许在数据库中创建新的schema。

对于schema,允许在schema内创建新对象。 要重命名现有对象,您必须拥有该对象,并对包含的schema具有此特权。

对于表空间,允许在表空间内创建表和索引,并允许创建将表空间作为其默认表空间的数据库。 (请注意,撤消此特权不会更改现有对象的位置。)

CONNECT

允许用户连接到指定的数据库。 在连接启动时会检查此特权(除了检查pg_hba.conf施加的任何限制)。

TEMPORARY

TEMP

允许在使用数据库时创建临时表。

EXECUTE

允许使用指定的函数以及使用在该函数之上实现的任何运算符。 这是适用于函数的唯一特权类型。 (此语法也适用于聚合函数。)

USAGE

对于过程语言,允许使用指定的语言来创建该语言的函数。 这是适用于过程语言的唯一特权类型。

对于schema,允许访问指定schema中包含的对象(假设还满足对象自己的特权要求)。 从本质上讲,这允许被授予者在schema中查找对象。

对于序列,此特权允许使用currval()和nextval()函数。

对于类型和域,此特权允许在创建表,函数和其他schema对象时使用类型或域。 (请注意,它不控制类型的一般“用法”,例如查询中出现的类型的值。它仅防止创建依赖于类型的对象。 特权的主要目的是控制哪些用户基于类型创建依赖关系,这可能会阻止所有者稍后更改类型。)

对于外部数据包装器,此特权使被授予者可以使用该外部数据包装器创建新服务器。

对于服务器,此特权使被授予者可以使用服务器创建外部表, 还可以创建,更改或删除其自己与该服务器关联的用户的用户映射。

ALL PRIVILEGES

一次授予所有可用特权。 PRIVILEGES关键字在Greenplum数据库中是可选的,尽管严格的SQL要求使用。

PUBLIC

特殊的组级角色,表示将特权授予所有角色,包括以后可能创建的角色。

WITH GRANT OPTION

特权的接收者可以依次将其授予他人。

WITH ADMIN OPTION

角色的成员又可以将角色的成员身份授予其他人。

注解

如果用户对特定列或整个表拥有该特权,则用户可以在该列上执行SELECT,INSERT等操作。 在表级别上授予特权,然后将其撤销一列,这并不像你预想的那样: 表级授予不受列级操作的影响。

数据库超级用户可以访问所有对象,而不管对象特权设置如何。 该对象的一个例外是视图对象。 对视图中引用的表的访问权限是由视图所有者(不是当前用户,即使当前用户是超级用户)的权限决定的。

如果超级用户选择执行GRANT或REVOKE命令,则该命令的执行就像是由受影响对象的所有者执行的一样。 特别是,通过此类命令授予的特权似乎已由对象所有者授予。 对于角色成员资格,成员资格似乎已由包含它的角色授予。

GRANT和REVOKE也可以由不是受影响对象的所有者完成,但要求是拥有该对象的角色的成员, 或者是拥有对该对象的WITH GRANT OPTION特权的角色的成员来完成。 在这种情况下,特权将被记录为已由实际拥有对象或拥有WITH GRANT OPTION特权的角色授予。

授予表权限不会自动将权限扩展到该表使用的任何序列,包括与SERIAL列绑定的序列。 序列的权限必须单独设置。

GRANT命令不能用于为协议file,gpfdist或gpfdists设置特权。 这些协议在Greenplum数据库内部实现。 而是使用CREATE ROLEALTER ROLE命令来设置角色的CREATEEXTTABLE属性。

使用psql的\dp元命令来获取有关表和列的现有特权的信息。 您还可以使用其他\d元命令来显示非表对象的特权。

示例

向表mytable上的所有角色授予插入权限:

将所有可用的特权授予在topten视图中的角色sally。 请注意,如果上述内容的确会由超级用户或topten的所有者执行, 将会授予所有特权,当由其他人执行时,它只会授予那些授予角色具有授予选项的那些权限。

将角色admins的成员资格授予用户joe:

兼容性

PRIVILEGES关键字在SQL标准中是必需的,但在Greenplum数据库中是可选的。 SQL标准不支持为每个命令在多个对象上设置特权。

Greenplum数据库允许对象所有者撤消他们自己的普通特权: 例如,表所有者可以通过撤消其自己的INSERT,UPDATE,DELETE和TRUNCATE特权使该表对自己只读。 根据SQL标准,这是不可能的。 Greenplum数据库将所有者的特权视为由所有者授予了所有者;因此他们也可以撤销它们。 在SQL标准中,所有者的特权由假定的system实体授予。

SQL标准为其他类型的对象提供USAGE特权:字符集,排序规则,翻译。

在SQL标准中,序列仅具有USAGE特权, 该特权控制NEXT VALUE FOR表达式的使用,该表达式等效于Greenplum数据库中的nextval函数。 序列特权SELECT和UPDATE是Greenplum数据库扩展。 对currval函数应用序列USAGE特权也是Greenplum数据库扩展(函数本身也是)。

数据库,表空间,模式和语言的特权是Greenplum数据库扩展。

REVOKE

删除访问权限。

概要

描述

REVOKE命令从一个或多个角色撤消先前授予的特权。 关键字PUBLIC指所有角色的隐式定义组。

有关特权类型的含义,请参见GRANT命令的描述。

请注意,任何特定角色将具有直接授予它的特权,授予该角色当前成员的任何角色的特权以及授予PUBLIC的特权的总和。 因此,例如,从PUBLIC撤消SELECT特权并不一定意味着所有角色都对该对象失去SELECT特权: 直接或通过其他角色授予它的那些人仍然拥有该特权。 同样,如果PUBLIC或其他成员身份角色仍然具有SELECT权限, 则从用户撤消SELECT可能不会阻止该用户使用SELECT。

如果指定了GRANT OPTION FOR,则仅撤销特权的授予选项,而不撤销特权本身。 否则,特权和授予选项都将被撤销。

如果某个角色拥有带有“授予”选项的特权并将其授予其他角色,则这些其他角色所拥有的特权称为“从属特权”。 如果第一个角色持有的特权或授予选项被撤销,并且存在从属特权, 则如果指定了CASCADE,那些从属特权也将被撤销,否则撤销操作将失败。 此递归撤销仅影响通过可追溯到此REVOKE命令对象的角色的角色链授予的特权。 因此,如果还通过其他角色授予了特权,则受影响的角色可以有效地保留特权。

当您撤消对表的特权时,Greenplum数据库也会撤消对表的每一列的相应列特权(如果有)。 另一方面,如果已授予角色某个表的特权,则从单独列中撤消相同的特权将无效。

撤销角色成员身份时,GRANT OPTION改为ADMIN OPTION,但行为类似。

参数

参见GRANT

注解

用户只能撤消该用户直接授予的那些特权。 例如,如果用户A向用户B授予了具有授予选项的特权,而用户B又将其授予了用户C,则用户A无法直接从C撤消该特权。 而是,用户A可以撤消用户B的授予选项,并使用CASCADE选项,以便依次从用户C撤消特权。 例如,如果A和B都向C授予相同的特权,则A可以撤消他自己的授予,但不能撤消B的授予,因此C实际上仍然有特权。

当对象的非所有者尝试REVOKE对对象的特权时,如果用户对对象没有任何特权,则该命令将彻底失败。 只要有某些特权,该命令就会继续执行,但是它将仅撤销用户具有授予选项的那些特权。 如果未保留任何授予选项,则REVOKE ALL PRIVILEGES形式将发出警告消息, 而如果未保留针对命令中明确指定的任何特权的授予选项,则其他形式将发出警告。 (原则上,这些声明也适用于对象所有者,但是由于Greenplum数据库始终将所有者视为拥有所有授予选项的对象,因此永远不会发生这种情况。)

如果超级用户选择发出GRANT或REVOKE命令, 则Greenplum数据库将执行该命令,就像它是由受影响对象的所有者发出的一样。 由于所有特权最终都来自对象所有者(可能间接地通过授予选项链), 因此超级用户可以撤消所有特权,但是如上所述,这可能需要使用CASCADE。

REVOKE也可以由不是受影响对象的所有者,但是拥有该对象的角色的成员, 或者是持有对该对象具有WITH GRANT OPTION特权的角色的成员来调用。 在这种情况下,Greenplum数据库将执行该命令,就像它是由实际拥有该对象或拥有WITH GRANT OPTION特权的用户所包含的角色发出的那样。 例如,如果表t1由角色g1拥有, 而角色u1是它的成员,则u1可以撤销t1上记录为由g1授予的特权。 这包括u1以及角色g1的其他成员所做的授权。

如果执行REVOKE的角色通过多个角色成员路径间接持有特权,则未指定将使用哪个包含角色来执行命令。 在这种情况下,最佳实践是使用SET ROLE来成为要REVOKE的特定角色。 否则,可能会导致撤销您想要的特权以外的特权,或者根本不撤销任何特权。

使用psql的\dp元命令来获取有关表和列的现有特权的信息。 您还可以使用其他\d元命令来显示非表对象的特权。

示例

撤销public对表films的插入特权:

从topten视图中的角色sally撤消所有特权。 请注意,这实际上意味着撤销当前角色(如果不是超级用户)授予的所有特权。

从用户joe撤消角色admins的成员资格:

兼容性

GRANT命令的兼容性说明也适用于REVOKE。

根据标准,需要RESTRICT或CASCADE, 但是默认情况下Greenplum数据库假定RESTRICT。

相关SQL

报错:ERROR: permission denied for sequence report_seq,请参考:https://www.xmmup.com/greenplumzhongdexulie.html#bao_cuoERROR_permission_denied_for_sequence_report_seq

注意,赋权时一定需要把表的owner赋权给需要查询的用户

参考

https://www.bookstack.cn/read/greenplum-admin_guide-6.0-zh/8fd2d3af5e4e8818.md

https://www.bookstack.cn/read/greenplum-admin_guide-6.0-zh/bc71dc2cc387142b.md

https://www.bookstack.cn/read/greenplum-admin_guide-6.0-zh/64d5e2dd69faa197.md

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部