GRANT命令的此变体向角色授予特定的数据库对象特权。这些特权会添加到已经授予的特权中(如果存在)。

关键字 PUBLIC 表示将特权授予所有角色,包括将来可能创建的角色。PUBLIC 可以视为一个隐式定义的组,其中始终包含所有角色。所有特定角色具有向其直接授予的特权、向其当前作为其中成员的任何角色授予的特权以及授予 PUBLIC 的特权。

如果指定 WITHGRANT OPTION,则接收特权的角色可以再将特权授予其他角色。如果不使用授权选项,则接收方不能这样做。不能将授权选项授予 PUBLIC

无需向对象所有者(通常是创建对象的用户)授予特权,因为所有者在默认情况下具有所有特权。(不过,所有者可以选择撤销自己的部分特权以保证安全。)可授予特权中不包括删除对象或以任何方式对其定义进行变更的权利;这是所有者的固有权利,不能将其授予其他用户或撤销。另外,所有者绝对具有所有授权选项。

根据对象的类型,初始默认特权可能包括将部分特权授予 PUBLIC。默认特权是指对表进行非公开访问以及对函数、存储过程和包的 EXECUTE 特权。对象所有者当然可以撤销这些特权。(为了最大程度地保证安全,请通过创建对象的同一个事务发出 REVOKE;之后,不存在其他用户可以使用该对象的窗口。)

特权可能包括如下表所示。

特权 说明
SELECT 允许对所指定表、视图或序列的所有列执行 SELECT。对于序列,该特权还允许使用 currval 函数。
INSERT 允许对所指定表执行 INSERT 操作以插入新行。
UPDATE 允许对所指定表的列执行 UPDATESELECT ... FOR UPDATE 还需要此特权(除 SELECT 特权外)。
DELETE 允许对所指定表的行执行 DELETE
REFERENCES 要创建外键约束,需要对引用表和被引用表都具有此特权。
EXECUTE 允许使用指定的包、存储过程或函数。应用于包时,允许使用所有包的公共存储过程、公共函数、公共变量、记录、光标以及其他公共对象和对象类型。这是唯一一个适用于函数、存储过程和包的特权类型。

PolarDB-O 中授予 EXECUTE 特权的语法与 Oracle 数据库并不完全兼容。PolarDB-O 需要使用以下关键字之一限定程序名称:FUNCTIONPROCEDUREPACKAGE;而在 Oracle 中,必须省略这些关键字。对于函数,PolarDB-O 需要在函数名称后包括所有输入(ININ OUT)参数数据类型(如果没有函数参数,则包含空括号)。对于存储过程,如果其中具有一个或多个输入参数,则必须指定所有输入参数数据类型。在 Oracle 中,必须省略函数和存储过程签名。这是因为在 Oracle 中,所有程序共享同一个命名空间,而在 PolarDB-O 中,函数、存储过程和包具有它们自己的单独命名空间,从而在某种程度上允许重载程序名称。

ALL PRIVILEGES 一次性授予所有可用特权。

其他命令需要的特权在对应命令的参考页面上列出。