适用版本
OceanBase 数据库 V2.x、V3.x 版本。
问题现象
尝试参照 MySQL 的语法,执行细分到列的授权,遇到语法错误的报错。
obclient [test]> grant update(str) on test.test_grant_tab to U_LDL@'%';
返回结果如下:
ERROR 1064(42000): You have an error in your SOL syntax; check the manual that corresponds to your OceanBase veraion for the right syntax to use near '(str) on test.test_grant_tab to U LDL@'*'' at line 1
问题原因
MySQL 租户下,指定授予权限的层级。权限可以分为以下几个层级:
- 全局层级:适用于所有的数据库。使用
GRANT ALL ON *.*授予全局权限。 - 数据库层级:适用于一个给定数据库中的所有目标。使用
GRANT ALL ON db_name.*授予数据库权限。 - 表层级:表权限适用于一个给定表中的所有列。使用
GRANT ALL ON database_name.table_name授予表权限。 用*代替 table_name,表示赋予全局权限,即对数据库中的所有表赋权。
如上文所述,不支持列级授权属于预期内行为。
解决方法
可通过视图进行绕行,上述例子中,对应的语句如下:
创建视图
test_grant_view。obclient [test]> create view test_grant_view as select id str from test.test_grant;授权。
obclient [test]> grant update on test grant view to U_LDL@'*';