授权
- 给ClickHouse的用户或角色赋予 权限
- 将角色分配给用户或其他角色
取消权限,使用 REVOKE语句。查看已授权的权限请使用 SHOW GRANTS。
授权操作语法
GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION]
privilege— 权限类型role— 用户角色user— 用户账号
WITH GRANT OPTION 授予 user 或 role执行 GRANT 操作的权限。用户可将在自身权限范围内的权限进行授权
WITH REPLACE OPTION 以当前sql里的新权限替代掉 user 或 role的旧权限,如果没有该选项则是追加授权。
角色分配的语法
GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] [WITH REPLACE OPTION]
role— 角色user— 用户WITH ADMIN OPTION授予user或role执行ADMIN OPTION 的权限WITH REPLACE OPTION以当前sql里的新role替代掉user或role的旧role,如果没有该选项则是追加roles。
用法
使用 GRANT,你的账号必须有 GRANT OPTION的权限。用户只能将在自身权限范围内的权限进行授权
例如,管理员有权通过下面的语句给 john账号添加授权
GRANT SELECT(x,y) ON db.table TO john WITH GRANT OPTION
这意味着 john 有权限执行以下操作:
SELECT x,y FROM db.table.SELECT x FROM db.table.SELECT y FROM db.table.
john 不能执行SELECT z FROM db.table。同样的 SELECT * FROMdb.table 也是不允许的。执行这个查询时,CH不会返回任何数据,甚至 x 和 y列。唯一的例外是,当表仅包含 x和y列时。这种情况下,CH返回所有数据。
同样 john 有权执行 GRANT OPTION,因此他能给其它账号进行和自己账号权限范围相同的授权。
可以使用* 号代替表或库名进行授权操作。例如, GRANT SELECT ONdb.* TO john 操作运行 john对 db库的所有表执行 SELECT查询。同样,你可以忽略库名。在这种情形下,权限将指向当前的数据库。例如, GRANT SELECT ON* to john 对当前数据库的所有表指定授权, GRANT SELECT ON mytable to john对当前数据库的 mytable表进行授权。
访问 systen数据库总是被允许的(因为这个数据库用来处理sql操作)
可以一次给多个账号进行多种授权操作。 GRANT SELECT,INSERT ON *.* TO john,robin 允许 john和robin 账号对任意数据库的任意表执行 INSERT和 SELECT操作。
权限
权限是指执行特定操作的许可
权限有层级结构。一组允许的操作依赖相应的权限范围。
权限的层级:
ALTER TABLEALTER UPDATEALTER DELETEALTER COLUMNALTER ADD COLUMNALTER DROP COLUMNALTER MODIFY COLUMNALTER COMMENT COLUMNALTER CLEAR COLUMNALTER RENAME COLUMN
ALTER INDEXALTER ORDER BYALTER ADD INDEXALTER DROP INDEXALTER MATERIALIZE INDEXALTER CLEAR INDEX
ALTER CONSTRAINTALTER ADD CONSTRAINTALTER DROP CONSTRAINT
ALTER TTLALTER MATERIALIZE TTLALTER SETTINGSALTER MOVE PARTITIONALTER FETCH PARTITIONALTER FREEZE PARTITION
ALTER VIEWALTER VIEW REFRESHALTER VIEW MODIFY QUERY
CREATE DATABASECREATE TABLECREATE VIEWCREATE DICTIONARYCREATE TEMPORARY TABLE
DROP DATABASEDROP TABLEDROP VIEWDROP DICTIONARY
SHOW DATABASESSHOW TABLESSHOW COLUMNSSHOW DICTIONARIES
CREATE USERALTER USERDROP USERCREATE ROLEALTER ROLEDROP ROLECREATE ROW POLICYALTER ROW POLICYDROP ROW POLICYCREATE QUOTAALTER QUOTADROP QUOTACREATE SETTINGS PROFILEALTER SETTINGS PROFILEDROP SETTINGS PROFILESHOW ACCESSSHOW_USERSSHOW_ROLESSHOW_ROW_POLICIESSHOW_QUOTASSHOW_SETTINGS_PROFILES
ROLE ADMIN
SYSTEM SHUTDOWNSYSTEM DROP CACHESYSTEM DROP DNS CACHESYSTEM DROP MARK CACHESYSTEM DROP UNCOMPRESSED CACHE
SYSTEM RELOADSYSTEM RELOAD CONFIGSYSTEM RELOAD DICTIONARYSYSTEM RELOAD EMBEDDED DICTIONARIES
SYSTEM MERGESSYSTEM TTL MERGESSYSTEM FETCHESSYSTEM MOVESSYSTEM SENDSSYSTEM DISTRIBUTED SENDSSYSTEM REPLICATED SENDS
SYSTEM REPLICATION QUEUESSYSTEM SYNC REPLICASYSTEM RESTART REPLICASYSTEM FLUSHSYSTEM FLUSH DISTRIBUTEDSYSTEM FLUSH LOGS
addressToLineaddressToSymboldemangle
AZUREFILEHDFSHIVEJDBCKAFKAMONGOMYSQLNATSODBCPOSTGRESRABBITMQREDISREMOTES3SQLITEURL
如何对待该层级的示例:
ALTER权限包含所有其它ALTER *的权限ALTER CONSTRAINT包含ALTER ADD CONSTRAINT和ALTER DROP CONSTRAINT权限
权限被应用到不同级别。 Knowing of a level suggests syntax available for privilege.
级别(由低到高):
COLUMN- 可以授权到列,表,库或者全局TABLE- 可以授权到表,库,或全局VIEW- 可以授权到视图,库,或全局DICTIONARY- 可以授权到字典,库,或全局DATABASE- 可以授权到数据库或全局GLABLE- 可以授权到全局GROUP- 不同级别的权限分组。当授予GROUP级别的权限时, 根据所用的语法,只有对应分组中的权限才会被分配。
允许的语法示例:
GRANT SELECT(x) ON db.table TO userGRANT SELECT ON db.* TO user
不允许的语法示例:
GRANT CREATE USER(x) ON db.table TO userGRANT CREATE USER ON db.* TO user
特殊的权限 ALL 将所有权限授予给用户或角色
默认情况下,一个用户账号或角色没有可授予的权限
如果用户或角色没有任何权限,它将显示为 NONE权限
有些操作根据它们的实现需要一系列的权限。例如, RENAME操作需要以下权限来执行:SELECT, CREATE TABLE, INSERT 和 DROP TABLE。
SELECT
允许执行 SELECT 查询
权限级别: COLUMN.
说明
有该权限的用户可以对指定的表和库的指定列进行 SELECT查询。如果用户查询包含了其它列则结果不返回数据。
考虑如下的授权语句:
GRANT SELECT(x,y) ON db.table TO john
该权限允许 john 对 db.table表的列x,y执行任意 SELECT 查询,例如 SELECT x FROM db.table。 john 不能执行 SELECT z FROM db.table以及 SELECT * FROM db.table。执行这个查询时,CH不会返回任何数据,甚至 x 和 y列。唯一的例外是,当表仅包含 x和y列时。这种情况下,CH返回所有数据。
INSERT
允许执行 INSERT 操作.
权限级别: COLUMN.
说明
有该权限的用户可以对指定的表和库的指定列进行 INSERT操作。如果用户查询包含了其它列则结果不返回数据。
示例
GRANT INSERT(x,y) ON db.table TO john
该权限允许 john 对 db.table表的列x,y执行数据插入操作
ALTER
允许根据下列权限层级执行 ALTER操作
ALTER. 级别:COLUMN.ALTER TABLE. 级别:GROUPALTER UPDATE. 级别:COLUMN. 别名:UPDATEALTER DELETE. 级别:COLUMN. 别名:DELETEALTER COLUMN. 级别:GROUPALTER ADD COLUMN. 级别:COLUMN. 别名:ADD COLUMNALTER DROP COLUMN. 级别:COLUMN. 别名:DROP COLUMNALTER MODIFY COLUMN. 级别:COLUMN. 别名:MODIFY COLUMNALTER COMMENT COLUMN. 级别:COLUMN. 别名:COMMENT COLUMNALTER CLEAR COLUMN. 级别:COLUMN. 别名:CLEAR COLUMNALTER RENAME COLUMN. 级别:COLUMN. 别名:RENAME COLUMN
ALTER INDEX. 级别:GROUP. 别名:INDEXALTER ORDER BY. 级别:TABLE. 别名:ALTER MODIFY ORDER BY,MODIFY ORDER BYALTER ADD INDEX. 级别:TABLE. 别名:ADD INDEXALTER DROP INDEX. 级别:TABLE. 别名:DROP INDEXALTER MATERIALIZE INDEX. 级别:TABLE. 别名:MATERIALIZE INDEXALTER CLEAR INDEX. 级别:TABLE. 别名:CLEAR INDEX
ALTER CONSTRAINT. 级别:GROUP. 别名:CONSTRAINTALTER ADD CONSTRAINT. 级别:TABLE. 别名:ADD CONSTRAINTALTER DROP CONSTRAINT. 级别:TABLE. 别名:DROP CONSTRAINT
ALTER TTL. 级别:TABLE. 别名:ALTER MODIFY TTL,MODIFY TTLALTER MATERIALIZE TTL. 级别:TABLE. 别名:MATERIALIZE TTLALTER SETTINGS. 级别:TABLE. 别名:ALTER SETTING,ALTER MODIFY SETTING,MODIFY SETTINGALTER MOVE PARTITION. 级别:TABLE. 别名:ALTER MOVE PART,MOVE PARTITION,MOVE PARTALTER FETCH PARTITION. 级别:TABLE. 别名:FETCH PARTITIONALTER FREEZE PARTITION. 级别:TABLE. 别名:FREEZE PARTITION
如何对待该层级的示例:
ALTER权限包含所有其它ALTER *的权限ALTER CONSTRAINT包含ALTER ADD CONSTRAINT和ALTER DROP CONSTRAINT权限
备注
MODIFY SETTING权限允许修改表的引擎设置。它不会影响服务的配置参数ATTACH操作需要 CREATE 权限.DETACH操作需要 DROP 权限.- 要通过 KILL MUTATION 操作来终止mutation, 你需要有发起mutation操作的权限。例如,当你想终止
ALTER UPDATE操作时,需要有ALTER UPDATE,ALTER TABLE, 或ALTER权限
CREATE
允许根据下面的权限层级来执行 CREATE 和 ATTACH DDL语句:
CREATE. 级别:GROUPCREATE DATABASE. 级别:DATABASECREATE TABLE. 级别:TABLECREATE VIEW. 级别:VIEWCREATE DICTIONARY. 级别:DICTIONARYCREATE TEMPORARY TABLE. 级别:GLOBAL
备注
- 删除已创建的表,用户需要 DROP权限
DROP
允许根据下面的权限层级来执行 DROP 和 DETACH :
DROP. 级别:DROP DATABASE. 级别:DATABASEDROP TABLE. 级别:TABLEDROP VIEW. 级别:VIEWDROP DICTIONARY. 级别:DICTIONARY
TRUNCATE
允许执行 TRUNCATE .
权限级别: TABLE.
OPTIMIZE
允许执行 OPTIMIZE TABLE .
权限级别: TABLE.
SHOW
允许根据下面的权限层级来执行 SHOW, DESCRIBE, USE, 和 EXISTS :
SHOW. 级别:GROUPSHOW DATABASES. 级别:DATABASE. 允许执行SHOW DATABASES,SHOW CREATE DATABASE,USE <database>.SHOW TABLES. 级别:TABLE. 允许执行SHOW TABLES,EXISTS <table>,CHECK <table>.SHOW COLUMNS. 级别:COLUMN. 允许执行SHOW CREATE TABLE,DESCRIBE.SHOW DICTIONARIES. 级别:DICTIONARY. 允许执行SHOW DICTIONARIES,SHOW CREATE DICTIONARY,EXISTS <dictionary>.
备注
用户同时拥有 SHOW权限,当用户对指定表,字典或数据库有其它的权限时。
KILL QUERY
允许根据下面的权限层级来执行 KILL:
权限级别: GLOBAL.
备注
KILL QUERY 权限允许用户终止其它用户提交的操作。
访问管理
允许用户执行管理用户/角色和行规则的操作:
ACCESS MANAGEMENT. 级别:GROUPCREATE USER. 级别:GLOBALALTER USER. 级别:GLOBALDROP USER. 级别:GLOBALCREATE ROLE. 级别:GLOBALALTER ROLE. 级别:GLOBALDROP ROLE. 级别:GLOBALROLE ADMIN. 级别:GLOBALCREATE ROW POLICY. 级别:GLOBAL. 别名:CREATE POLICYALTER ROW POLICY. 级别:GLOBAL. 别名:ALTER POLICYDROP ROW POLICY. 级别:GLOBAL. 别名:DROP POLICYCREATE QUOTA. 级别:GLOBALALTER QUOTA. 级别:GLOBALDROP QUOTA. 级别:GLOBALCREATE SETTINGS PROFILE. 级别:GLOBAL. 别名:CREATE PROFILEALTER SETTINGS PROFILE. 级别:GLOBAL. 别名:ALTER PROFILEDROP SETTINGS PROFILE. 级别:GLOBAL. 别名:DROP PROFILESHOW ACCESS. 级别:GROUPSHOW_USERS. 级别:GLOBAL. 别名:SHOW CREATE USERSHOW_ROLES. 级别:GLOBAL. 别名:SHOW CREATE ROLESHOW_ROW_POLICIES. 级别:GLOBAL. 别名:SHOW POLICIES,SHOW CREATE ROW POLICY,SHOW CREATE POLICYSHOW_QUOTAS. 级别:GLOBAL. 别名:SHOW CREATE QUOTASHOW_SETTINGS_PROFILES. 级别:GLOBAL. 别名:SHOW PROFILES,SHOW CREATE SETTINGS PROFILE,SHOW CREATE PROFILE
ROLE ADMIN 权限允许用户对角色进行分配以及撤回,包括根据管理选项尚未分配的角色
SYSTEM
允许根据下面的权限层级来执行 SYSTEM :
SYSTEM. 级别:GROUPSYSTEM SHUTDOWN. 级别:GLOBAL. 别名:SYSTEM KILL,SHUTDOWNSYSTEM DROP CACHE. 别名:DROP CACHESYSTEM DROP DNS CACHE. 级别:GLOBAL. 别名:SYSTEM DROP DNS,DROP DNS CACHE,DROP DNSSYSTEM DROP MARK CACHE. 级别:GLOBAL. 别名:SYSTEM DROP MARK,DROP MARK CACHE,DROP MARKSSYSTEM DROP UNCOMPRESSED CACHE. 级别:GLOBAL. 别名:SYSTEM DROP UNCOMPRESSED,DROP UNCOMPRESSED CACHE,DROP UNCOMPRESSED
SYSTEM RELOAD. 级别:GROUPSYSTEM RELOAD CONFIG. 级别:GLOBAL. 别名:RELOAD CONFIGSYSTEM RELOAD DICTIONARY. 级别:GLOBAL. 别名:SYSTEM RELOAD DICTIONARIES,RELOAD DICTIONARY,RELOAD DICTIONARIESSYSTEM RELOAD EMBEDDED DICTIONARIES. 级别:GLOBAL. 别名: RELOAD EMBEDDED DICTIONARIES
SYSTEM MERGES. 级别:TABLE. 别名:SYSTEM STOP MERGES,SYSTEM START MERGES,STOP MERGES,START MERGESSYSTEM TTL MERGES. 级别:TABLE. 别名:SYSTEM STOP TTL MERGES,SYSTEM START TTL MERGES,STOP TTL MERGES,START TTL MERGESSYSTEM FETCHES. 级别:TABLE. 别名:SYSTEM STOP FETCHES,SYSTEM START FETCHES,STOP FETCHES,START FETCHESSYSTEM MOVES. 级别:TABLE. 别名:SYSTEM STOP MOVES,SYSTEM START MOVES,STOP MOVES,START MOVESSYSTEM SENDS. 级别:GROUP. 别名:SYSTEM STOP SENDS,SYSTEM START SENDS,STOP SENDS,START SENDSSYSTEM DISTRIBUTED SENDS. 级别:TABLE. 别名:SYSTEM STOP DISTRIBUTED SENDS,SYSTEM START DISTRIBUTED SENDS,STOP DISTRIBUTED SENDS,START DISTRIBUTED SENDSSYSTEM REPLICATED SENDS. 级别:TABLE. 别名:SYSTEM STOP REPLICATED SENDS,SYSTEM START REPLICATED SENDS,STOP REPLICATED SENDS,START REPLICATED SENDS
SYSTEM REPLICATION QUEUES. 级别:TABLE. 别名:SYSTEM STOP REPLICATION QUEUES,SYSTEM START REPLICATION QUEUES,STOP REPLICATION QUEUES,START REPLICATION QUEUESSYSTEM SYNC REPLICA. 级别:TABLE. 别名:SYNC REPLICASYSTEM RESTART REPLICA. 级别:TABLE. 别名:RESTART REPLICASYSTEM FLUSH. 级别:GROUPSYSTEM FLUSH DISTRIBUTED. 级别:TABLE. 别名:FLUSH DISTRIBUTEDSYSTEM FLUSH LOGS. 级别:GLOBAL. 别名:FLUSH LOGS
SYSTEM RELOAD EMBEDDED DICTIONARIES 权限隐式的通过操作 SYSTEM RELOAD DICTIONARY ON *.* 来进行授权.
内省introspection
允许使用 introspection 函数.
INTROSPECTION. 级别:GROUP. 别名:INTROSPECTION FUNCTIONSaddressToLine. 级别:GLOBALaddressToSymbol. 级别:GLOBALdemangle. 级别:GLOBAL
数据源
允许在 table engines 和 table functions中使用外部数据源。
SOURCES. 级别:GROUPAZURE. 级别:GLOBALFILE. 级别:GLOBALHDFS. 级别:GLOBALHIVE. 级别:GLOBALJDBC. 级别:GLOBALKAFKA. 级别:GLOBALMONGO. 级别:GLOBALMYSQL. 级别:GLOBALNATS. 级别:GLOBALODBC. 级别:GLOBALPOSTGRES. 级别:GLOBALRABBITMQ. 级别:GLOBALREDIS. 级别:GLOBALREMOTE. 级别:GLOBALS3. 级别:GLOBALSQLITE. 级别:GLOBALURL. 级别:GLOBAL
SOURCES 权限允许使用所有数据源。当然也可以单独对每个数据源进行授权。要使用数据源时,还需要额外的权限。
示例:
- 创建 MySQL table engine, 需要
CREATE TABLE (ON db.table_name)和MYSQL权限。4 - 要使用 mysql table function,需要
CREATE TEMPORARY TABLE和MYSQL权限
dictGet
dictGet. 别名:dictHas,dictGetHierarchy,dictIsIn
允许用户执行 dictGet, dictHas, dictGetHierarchy, dictIsIn 等函数.
权限级别: DICTIONARY.
示例
GRANT dictGet ON mydb.mydictionary TO johnGRANT dictGet ON mydictionary TO john
ALL
对规定的实体(列,表,库等)给用户或角色授予所有权限
NONE
不授予任何权限
ADMIN OPTION
ADMIN OPTION 权限允许用户将他们的角色分配给其它用户