列级别权限

简介

平凯数据库自 7.1.8 版本开始支持列级别权限,该功能和 MySQL 的列级别权限功能相同。平凯数据库当前支持 Select、Update、Insert 与 References 四种列级别权限,与 MySQL 兼容。列级别权限的分配、删除与表级别权限类似,不同的地方在于需要在表名后指定表中的列名列表,多个列名之间用逗号 , 分隔。

列权限的分配示例

向用户 newuser 分配表 tbl 中 col1 与 col2 列的 Select 权限,并分配表 tbl 中 col3 列的 Update 权限:

CREATE TABLE tbl (col1 INT, col2 INT, col3 INT); CREATE USER newuser; GRANT SELECT(col1, col2), UPDATE(col3) ON tbl TO newuser; SHOW GRANTS FOR newuser; +---------------------------------------------------------------------+ | Grants for newuser@% | +---------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'newuser'@'%' | | GRANT SELECT(col1, col2), UPDATE(col3) ON test.tbl TO 'newuser'@'%' | +---------------------------------------------------------------------|

列权限的删除示例

删除用户 newuser col2 列的 Select 权限:

REVOKE SELECT(col2) ON tbl FROM newuser; SHOW GRANTS FOR newuser; +---------------------------------------------------------------------+ | Grants for newuser@% | +---------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'newuser'@'%' | | GRANT SELECT(col1), UPDATE(col3) ON test.tbl TO 'newuser'@'%' | +---------------------------------------------------------------------+

列权限的检查

在上述分配给 newuser 对 col1 的 Select 列级别权限与对 col3 的 Update 列级别权限之后,newuser 只能对 col1 进行查询,在 UPDATE 语句中只能对 col3 进行修改,且只能在 WHERE、ORDER BY 等子句中使用 col1:

-- 以 newuser 的身份登录平凯数据库 SELECT col1 FROM tbl; SELECT * FROM tbl; -- error UPDATE tbl SET col3 = 1; UPDATE tbl SET col1 = 2; -- error UPDATE tbl SET col3 = col1; UPDATE tbl SET col3 = col3 + 1; -- error,需要对 col3 的 Select 列级别权限 UPDATE tbl SET col3 = col1 WHERE col1 > 0;

与 MySQL 的兼容性

列级别权限在平凯数据库与 MySQL 中行为基本一致。在 revoke 未 grant 的列级别权限上,存在不一致:

  • 平凯数据库中 revoke 未 grant 给用户的列级别权限时,REVOKE 语句可成功执行。

  • MySQL 中 revoke 未 grant 给用户的列级别权限时,REVOKE 语句报错:

    Error 1147 (42000): There is no such grant defined for user 'test_user' on host '%' on table 't'