列级别权限
简介
平凯数据库自 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'