mysql系统表加trigger和对特定的库禁用 DDL 语句
给 mysql 系统表加上 trigger
1 Reply
默认情况下,mysql 是不能给系统表,例如 mysql.user 加上触发器的。会提示
ERROR 1465 (HY000): Triggers can not be created on system tables
但是还是可以有办法绕过这个限制。
在其他 db 里另外建一个结构名字一样的表,例如
create table test.user like mysql.user
然后在那个表上建好触发器。这样会在数据库目录中生成 “表名.TRG” 文件。把这个文件拷贝到 mysql 库的目录中,确认访问权限没问题后,重启一下 mysql ,触发器就可以生效了。
在 mysql 中对特定的库禁用 DDL 语句
mysql 的权限控制功能虽然已经比较强大,但是是基于白名单规则,所以没法做到对除某某库,如 mysql 库以外的所有库分配权限,或者说单独禁用某个库的某些权限。虽然可以一个个库地分配,但是这样毕竟麻烦,尤其是在库的数量会动态变化的情况下。
对于 DDL 语句,也就是 create 、alter 、drop 之类,有一个特殊的办法可以做到。其实也很简单,去掉那个库所在的目录的写权限即可。例如:
chmod a-w mysql
之后,在 mysql 库上执行任意 DDL 语句都会出错。
这方法看着挺恶心,不过也没找到更好的解决办法。