#GRANT

# 通用描述

GRANT用于对某一用户或角色授予权限,权限内容包括:

授予给用户上的权限立即生效。

授予给角色上的权限立即生效,如该角色已被授权给某个用户,则该用户的权限也立即生效。

授予给用户或角色的角色在用户登录时生效,即给用户A授予角色B,授权前已登录的用户A不拥有该角色,A用户再次登录时角色B生效。

YashanDB的权限体系管理具体描述请查看产品安全手册权限管理

# 语句定义

grant::=

syntax
grant_object_privilege grant_system_privilege grant_role_privilege

grant_object_privilege::=

syntax
GRANT object_privilege ALL PRIVILEGES ON schema . object_name TO user_name WITH GRANT OPTION role

grant_system_privilege::=

syntax
GRANT system_privilege ALL PRIVILEGES TO user_name WITH ADMIN OPTION role

grant_role_privilege::=

syntax
GRANT role TO user_name WITH ADMIN OPTION role

# grant_object_privilege

该语句用于对用户或角色授予对象特权,如指定ALL PRIVILEGES表示授予所有对象特权。

某个对象的对象特权应该由其所属用户来授予,此外还有这几种用户可以授予:

  • 若打开三权分立功能,可以通过拥有SECURITY_ADMIN安全管理员角色的用户授予。
  • 若关闭三权分立功能,可以通过拥有SECURITY_ADMIN安全管理员角色或拥有DBA角色的用户授予。
  • 可以通过被授权该权限时指定了WITH GRANT OPTION语句的普通用户授予。
  • 可以通过拥有GRANT ANY OBJECT PRIVILEGE系统权限的普通用户授予。

# object_privilege

对象特权的名称,所有对象特权请查阅OBJECT PRIVILEGE

# object_name

对象的名称,支持指定为已创建的表或自定义类型

# user_name|role

用户|角色名称。

# with grant option

将对象特权授予某一个用户时,指定本语句表示该用户可以再将拥有的对象特权授予其他的用户或角色。

示例

-- 在用户sales下将表area的SELECT权限授予sales1用户
GRANT SELECT ON area TO sales1 WITH GRANT OPTION;

-- 此时sales1将拥有表area的SELECT权限,并可以再将此权限授予其他用户
conn sales1/1%2
GRANT SELECT ON sales.area TO sales2;

示例(单机、共享集群部署)

-- 在用户sales下将自定义类型udt_object的EXECUTE权限授予sales1用户
GRANT EXECUTE ON udt_object TO sales1;

# grant_system_privilege

该语句用于对用户或角色授予系统权限,如指定ALL PRIVILEGES表示授予所有系统权限。此外还有这几种用户可以授予:

  • 若打开三权分立功能,可以通过拥有SECURITY_ADMIN安全管理员角色的用户授予。
  • 若关闭三权分立功能,可以通过拥有SECURITY_ADMIN安全管理员角色或拥有DBA角色的用户授予。
  • 可以通过被授权该权限时指定了WITH ADMIN OPTION语句的普通用户授予。
  • 可以通过拥有GRANT ANY PRIVILEGE系统权限的普通用户授予。

# system_privilege

系统权限名称,所有可授权的系统权限见SYSTEM PRIVILEGE中描述。

# user_name|role

用户|角色名称。

# with admin option

将系统权限授予某一个用户时,指定本语句表示该用户拥有了对此权限的管理权限,即可以将该系统权限再授予给其他用户或角色。

示例

-- 将ALTER SYSTEM权限授予sales1用户
GRANT ALTER SYSTEM TO sales1 WITH ADMIN OPTION;
 
-- 此时sales1将拥有ALTER SYSTEM权限,并可以再将此权限授予其他用户
GRANT ALTER SYSTEM TO sales2;

# grant_role_privilege

该语句用于对用户或角色授予角色权限。此外还有这几种用户可以授予:

  • 若打开三权分立功能,可以通过拥有SECURITY_ADMIN安全管理员角色的用户授予。
  • 若关闭三权分立功能,可以通过拥有SECURITY_ADMIN安全管理员角色或拥有DBA角色的用户授予。
  • 可以通过拥有GRANT ANY ROLE的系统权限的普通用户授予。

该语句不适用于分布式部署。

# user_name|role

用户|角色名称。

# with admin option

将角色授予某一个用户时,指定本语句表示该用户拥有了对此角色的管理权限,即可以将该角色再授予给其他用户。

Note

授权SYSDBA和SYSOPER角色时,指定WITH ADMIN OPTION无效。

示例(单机部署)

-- 在sales用户下创建角色ya_rol1并授予其area表的SELECT权限
CREATE ROLE ya_rol1;
GRANT SELECT ON area TO ya_rol1;
 
-- 将ya_rol1角色权限授予sales1用户,则在sales1重新连接后,即可以拥有sales.area的SELECT权限,此操作需要sales用户拥有GRANT ANY ROLE权限
-- 由于未指定关键字WITH ADMIN OPTION,sale1不能将角色ya_rol1授予其他用户
GRANT ya_rol1 TO sales1;

-- 在sales用户下创建角色ya_rol2并授予其CREATE TABLE的权限,将ya_rol2授予ya_rol1, 由于ya_rol1已经授予sales1用户,则sales1重新连接后,可拥有ya_rol2角色
CREATE ROLE ya_rol2;
GRANT CREATE TABLE TO ya_rol2;
GRANT ya_rol2 TO ya_rol1;

-- 重新将ya_rol1角色权限授予sales1用户并指定关键字WITH ADMIN OPTION,此时sales1用户可将ya_rol1角色授予其他用户
REVOKE ya_rol1 FROM sales1;
GRANT ya_rol1 TO sales1 WITH ADMIN OPTION;