版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1426224
这是杂货铺的第470篇文章
我们的开发环境,为了控制DDL权限,给开放人员使用的账号,只是创建了一系列业务表的同义词,并用业务表属主授予了DML权限,这样开发人员,只能对表进行DML,不能进行DDL,如果需要DDL,就要走变更流程,便于我们对库结构变更的跟踪,以及上线脚本的控制。
但是最近一个新的功能,需要对某张表,执行truncate操作。众所周知,truncate虽然是删除数据,但他是DDL,不是DML操作,因此开发人员的账号,肯定不能执行。
创建测试表,并将该表DML授权user_a,
用user_a用户登录,执行truncate操作,提示错误如下,
按照truncate的定义,truncate只能删除用户属主的表,或者该用户拥有drop any table权限。
首先开发的这个账号,不是这张表属主,因此要执行truncate,只能拥有drop any table的权限,但这种做法,就增加了这个账号的权限,他可以删除任意可访问的表,不符合我们要求。
此时,只能曲线救国,首先在tbl_truncate属主用户下创建存储过程p_truncate,执行的操作,就是truncate table tbl_truncate,其次,将存储过程的执行权限,授予用户user_a,
user_b中,exec执行存储过程,即完成了truncate的操作,
如果要更纯粹些,屏蔽属主用户,可以创建同义词,即可直接执行存储过程,完成表的truncate操作,
但是这种存储过程的truncate,和实际程序中,使用truncate table,语法上,还是不同的,因此针对不同的场景,来选择合适方案,仅供参考。