列级权限控制
列级权限控制能够更精细地管理数据库用户对表中特定列的权限,用户可以有权访问表中的某些列,同时限制对其他列的访问。以下是 ProtonBase 列级权限控制的详细使用方法。
列级权限可以控制的数据操作类型包括:
SELECT | 控制数据的读取权限 |
UPDATE | 控制数据的更新权限,在 UPDATE、INSERT、COPY、INSERT ON CONFLICT、MERGE 时检查 |
列级权限作用的对象包括 TABLE,VIEW 和 MATERIALIZED VIEW。
列级权限概述
在 ProtonBase 中,可以通过 GRANT
和 REVOKE
命令操作表的单个列权限,实现对特定用户 查询 (SELECT
)、修改 (UPDATE
) 权限的限制。
赋予列级权限
GRANT {SELECT | UPDATE} (<列名>[, ...])
ON <表名>
TO <用户名>;
收回列级权限
REVOKE {SELECT | UPDATE} (<列名>[, ...])
ON <表名>
FROM <用户名>;
使用场景演示
场景:创建名为 employees
的表,并设置列级权限
-
创建表
CREATE TABLE employees ( id SERIAL PRIMARY KEY, name VARCHAR(50), salary NUMERIC, department VARCHAR(20) );
-
插入数据
INSERT INTO employees (name, salary, department) VALUES ('Alice', 50000, 'HR'), ('Bob', 70000, 'IT');
-
创建普通用户
CREATE USER normal_user WITH PASSWORD 'password';
-
仅授予
name
和department
列的SELECT
权限GRANT SELECT (name, department) ON employees TO normal_user;
-
测试用户权限 登录普通用户并查询:
SET ROLE normal_user; SELECT * FROM employees; -- 无法查看salary列,报错 permission denied for table employees SELECT name, department FROM employees; -- 查询成功
-
移除指定权限
REVOKE SELECT (department) ON employees FROM normal_user;
注意事项
-
列级权限不适用于以下操作:
INSERT
和DELETE
操作仍是表级权限。- 列级权限不会自动继承到分区子表,必须显式对每个分区子表设置相同的列级权限。
- 外键约束不会继承列级权限,也可能暴露某些字段信息,需要额外的 REFERENCE 权限。
-
权限的优先级:
- 如果因规则冲突,用户的 "拒绝权限" 优先于 "授予权限"。
-
若对完整表授予权限,如:
GRANT SELECT ON employees TO normal_user;
将允许用户访问表的所有列,覆盖列级权限。