【发布时间】:2020-08-27 22:29:05
【问题描述】:
Clickhouse官方文档暗示一个用户只能有一个配置文件,并且数据库配置在user部分,readonly配置在配置部分,所以readonly将影响所有用户的数据库。
那么,如何设置用户x只能读取数据库dbA,但可以读写数据库dbB?
【问题讨论】:
标签: readonly clickhouse access-rights
Clickhouse官方文档暗示一个用户只能有一个配置文件,并且数据库配置在user部分,readonly配置在配置部分,所以readonly将影响所有用户的数据库。
那么,如何设置用户x只能读取数据库dbA,但可以读写数据库dbB?
【问题讨论】:
标签: readonly clickhouse access-rights
考虑使用SQL-driven access control management:
CREATE DATABASE db_01;
CREATE DATABASE db_02;
CREATE TABLE db_01.table_01 (id Int32) Engine = Memory();
CREATE TABLE db_02.table_02 (id Int32) Engine = Memory();
INSERT INTO db_01.table_01 VALUES (1), (2);
INSERT INTO db_02.table_02 VALUES (10), (20);
CREATE USER user_01 HOST ANY PROFILE 'default';
/* Set readonly access to DB 'db_01'. */
GRANT SELECT ON db_01.* TO user_01;
/* Set read-write access to DB 'db_02'. */
GRANT SELECT ON db_02.* TO user_01;
GRANT INSERT ON db_02.* TO user_01;
SELECT currentUser(); /* Make sure that user is right. */
/*
┌─currentUser()─┐
│ user_01 │
└───────────────┘
*/
SHOW GRANTS; /* Double check the assigned privileges. */
/*
┌─GRANTS─────────────────────────────────────┐
│ GRANT SELECT ON db_01.* TO user_01 │
│ GRANT INSERT, SELECT ON db_02.* TO user_01 │
└────────────────────────────────────────────┘
*/
SELECT * FROM db_01.table_01; /* OK */
INSERT INTO db_01.table_01 VALUES (3); /* DB::Exception: user_01: Not enough privileges. */
SELECT * FROM db_02.table_02; /* OK */
INSERT INTO db_02.table_02 VALUES (30); /* OK */
上面的代码只是为了演示,你需要考虑引入角色/配额/..,继承另一个用户配置文件(更严格,不是'默认')等。
【讨论】: