grant
语法
grant(userId|groupId, accessType, [objs])
参数
userId | groupId 是表示用户名或组名的字符串。
accessType 权限类型/内存限制。
- 管理共享内存表、流数据表或流计算引擎的权限时,objs 必须为 "tableName@nodeAlias" 或"nodeAlias:tableName"。
- 管理 IMOLTP 引擎库表权限时,objs 必须为 "oltp://database/table@nodeAlias" 或 "oltp://database@nodeAlias"。
accessType 和 objs 的取值请参照 用户权限管理 权限类型表。
详情
grant
函数用于授予某个用户或用户组指定权限,包括:
- 管理员可通过该命令授予用户或用户组所有权限(任意 accessType)。
- 普通用户仅在拥有相关对象的 OWNER 权限时,才能授予以下权限:
TABLE_READ, TABLE_WRITE, TABLE_INSERT, TABLE_UPDATE, TABLE_DELETE, DB_READ, DB_WRITE, DB_INSERT, DB_UPDATE, DB_DELETE, DBOBJ_DELETE, DBOBJ_CREATE, VIEW_EXEC。
- accessType = DB_OWNER 支持通过 objs
指定一个或多个数据库名前缀,用于限制用户可创建和管理的数据库。多个前缀规则可通过向量传递。若用户已获得全局 DB_OWNER
权限,则该前缀规则无效。规则之间互不覆盖,除非某规则包含另一个。可通过
getUserAccess
函数查看用户已授权的前缀规则。权限判定逻辑如下:
- 若用户全局权限被拒绝,则禁止创建和管理数据库操作;
- 否则,只要数据库名称匹配任一前缀规则,操作即被允许。
注意:
- 前缀规则仅支持通过
grant
和revoke
进行授权和撤销,不能用deny
拒绝; - DB_OWNER 权限仅在全局范围生效,前缀规则覆盖先前定义的规则。
-
查询内存限制权限
- QUERY_RESULT_MEM_LIMIT:约束用户查询返回结果的内存上限;
- TASK_GROUP_MEM_LIMIT:约束用户发送的批量子查询占用的内存上限。
这两项权限功能等同于
setMemLimitOfQueryResult
和setMemLimitOfTaskGroupResult
,但仅针对指定用户生效,不支持用户组。
- accessType = CREATE_SHARED_VAR
该权限用于限制用户创建共享变量的能力,仅在系统参数 enableSharedVarCreationControl = true 时生效。该权限为全局权限,不支持通过对象(objs)进行细分控制。
默认情况下:
- admin 用户具备该权限;
- guest 用户及新建用户普通用户不具备,需显式授权;新建的管理员用户也不具备,但可以为自己显式授权。
若配置项为 false,系统不启用权限校验,所有用户均可创建共享变量(即权限设置存在但不生效)。
例子
授予组 "research" 的所有成员读取所有数据库表的权限:
grant(`research, TABLE_READ, "*")
授予组 "research" 的所有成员读写表 dfs://db1/t1 的权限:
grant(`research, TABLE_WRITE, "dfs://db1/t1")
授予组 "research" 的所有成员在数据库 dfs://db1 和 dfs://db2 创建表的权限:
grant("research", DBOBJ_CREATE, ["dfs://db1","dfs://db2"])
授予用户 "AlexSmith" 删除数据库的权限:
grant("AlexSmith", DB_MANAGE)
授予用户"AlexSmith"执行脚本的权限:
grant("AlexSmith", SCRIPT_EXEC)
授予用户 "AlexSmith" 测试脚本的权限:
grant("AlexSmith", TEST_EXEC)
授予用户”AlexSmith”命名空间 test1下函数 f1 的执行权限:
grant("AlexSmith", VIEW_EXEC, "test1::f1")
授予用户”AlexSmith”命名空间 test2 下所有函数的执行权限:
grant("AlexSmith", VIEW_EXEC, "test2::*")
命名空间必须是模块级别。例如有一个模块 test.dos,所在路径为 moduleDir/mod1/test.dos,为用户授权执行模块中所有函数时,应通过以下脚本实现:
grant("AlexSmith", VIEW_EXEC, "mod1::test::*")
不支持写成:
grant("AlexSmith", VIEW_EXEC, "mod1::*")
如果授权了某个命名空间,后来命名空间中的函数视图被通过 dropFunctionView
删除,一旦命名空间中的最后一个函数视图被删除,对该命名空间的授权也将自动回收。同理,授权时如果发现该命名空间下没有函数视图,会抛出异常。
对于没有命名空间的函数视图,被认为是全局的。以下两种方式等价:
grant("AlexSmith", VIEW_EXEC, "::f")
grant("AlexSmith", VIEW_EXEC, f)
约束用户查询所占用的内存:
指定 accessType 为 QUERY_RESULT_MEM_LIMIT,此时 objs 表示限制的内存大小,单位为 GB。下述脚本限制用户 "AlexSmith" 查询时,查询结果所占用的内存大小不能超过 4 GB。
grant("AlexSmith", QUERY_RESULT_MEM_LIMIT, 4)
约束用户只能创建指定前缀的数据库:
假设管理员要求限制用户 "AlexSmith" 只能创建并管理以 ddb 作为库名前缀的数据库,可以通过以下脚本实现:
grant("AlexSmith", DB_OWNER, "dfs://ddb*")
当指定 grant
函数的 accessType 为 DB_OWNER 时,可以指定
objs 为一个规则,目前仅支持约束用户可以创建的库名前缀,便于不同用户管理不同范围的数据库。
当需要指定多个规则时,可以为 objs 传入一个向量,如下脚本所示:
grant("AlexSmith", DB_OWNER, ["dfs://ddb_prefix1*","dfs://ddb_prefix2*"])
授权时,如果当前已有全局授权,则对某一前缀规则的授权将无效。如果前缀规则之间存在包含关系,则这些规则不会相互覆盖。
当用户创建或管理数据库时,如有全局禁止,则禁止执行,否则,用户的权限为所有前缀规则的并集,即如果库名符合已授权的任一前缀规则,则允许执行。已授权的前缀规则可以通过函数
getUserAccess
查看。
grant
指定、通过
revoke
移除,但不能通过 deny
禁止。当 accessType 为
DB_OWNER 时,deny
只能对全局生效,且会覆盖之前已有的前缀约束规则。