列级权限控制

列级权限控制

列级权限控制能够更精细地管理数据库用户对表中特定列的权限,用户可以有权访问表中的某些列,同时限制对其他列的访问。以下是 ProtonBase 列级权限控制的详细使用方法。

列级权限可以控制的数据操作类型包括:

SELECT控制数据的读取权限
UPDATE控制数据的更新权限,在 UPDATE、INSERT、COPY、INSERT ON CONFLICT、MERGE 时检查

列级权限作用的对象包括 TABLEVIEWMATERIALIZED VIEW

列级权限概述

在 ProtonBase 中,可以通过 GRANTREVOKE 命令操作表的单个列权限,实现对特定用户 查询 (SELECT)、修改 (UPDATE) 权限的限制。

赋予列级权限

GRANT {SELECT | UPDATE} (<列名>[, ...])
ON <表名>
TO <用户名>;

收回列级权限

REVOKE {SELECT | UPDATE} (<列名>[, ...])
ON <表名>
FROM <用户名>;

使用场景演示

场景:创建名为 employees 的表,并设置列级权限

  1. 创建表

    CREATE TABLE employees (
        id SERIAL PRIMARY KEY,
        name VARCHAR(50),
        salary NUMERIC,
        department VARCHAR(20)
    );
  2. 插入数据

    INSERT INTO employees (name, salary, department)
    VALUES
    ('Alice', 50000, 'HR'),
    ('Bob', 70000, 'IT');
  3. 创建普通用户

    CREATE USER normal_user WITH PASSWORD 'password';
  4. 仅授予 namedepartment 列的 SELECT 权限

    GRANT SELECT (name, department)
    ON employees
    TO normal_user;
  5. 测试用户权限 登录普通用户并查询:

    SET ROLE normal_user;
     
    SELECT * FROM employees; -- 无法查看salary列,报错 permission denied for table employees
    SELECT name, department FROM employees; -- 查询成功
  6. 移除指定权限

    REVOKE SELECT (department)
    ON employees
    FROM normal_user;

注意事项

  1. 列级权限不适用于以下操作:

    • INSERTDELETE 操作仍是表级权限
    • 列级权限不会自动继承到分区子表,必须显式对每个分区子表设置相同的列级权限。
    • 外键约束不会继承列级权限,也可能暴露某些字段信息,需要额外的 REFERENCE 权限。
  2. 权限的优先级:

    • 如果因规则冲突,用户的 "拒绝权限" 优先于 "授予权限"。
  3. 若对完整表授予权限,如:

    GRANT SELECT ON employees TO normal_user;

    将允许用户访问表的所有列,覆盖列级权限。

更多内容,参考 GRANTREVOKE