通过 information_schema 更新 mysql 触发器——访问被拒绝?

Joh*_*nst 3 mysql schema trigger

对于 MySQL(实际上是 MariaDB)中的某些触发器,我有一些错误的“定义器”。我认为纠正它们的最简单方法是以下版本:

use information_schema;
update triggers set definer=current_user() where trigger_schema='foobar';
Run Code Online (Sandbox Code Playgroud)

它产生:

ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'
Run Code Online (Sandbox Code Playgroud)

在同一个会话中,我可以使用“删除触发器”和“创建触发器”删除并重新创建触发器,因此我不了解权限问题。我的用户是否需要一些它没有的特权?

Rol*_*DBA 6

你在做什么是不可能的,因为 INFORMATION_SCHEMA 数据库是一个由内存只读临时表组成的数据库(见我的帖子INFORMATION_SCHEMA 如何在 MySQL 中实现?

您将不得不删除触发器并重新创建它们

我之前写过一篇文章(Oct 02, 2011可以 mysqldump 转储触发器和程序吗?

以下是您可以对foo数据库中的所有触发器执行的操作

步骤 01:mysqldump 触发器

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump -${MYSQL_CONN} -d -t --skip-routines --triggers foo > foo_make_triggers.sql
Run Code Online (Sandbox Code Playgroud)

为了澄清

步骤 02:创建一个脚本来删除所有触发器

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('DROP TRIGGER ',trigger_name,';')"
SQL="${SQL} FROM information_schema.triggers"
SQL="${SQL} WHERE trigger_schema = 'foo'"
mysql ${MYSQL_CONN} -ANe"${SQL}" > foo_drop_triggers.sql
Run Code Online (Sandbox Code Playgroud)

步骤 03:验证每个文件的内容

vi -R foo_drop_triggers.sql
vi -R foo_make_triggers.sql
Run Code Online (Sandbox Code Playgroud)

步骤 04:foo_make_triggers.sql如您所知,编辑所有定义器

步骤 05:登录到 mysql 并运行它

use foo
source foo_drop_triggers.sql
source foo_make_triggers.sql
Run Code Online (Sandbox Code Playgroud)

请在登台服务器上测试这个

试一试 !!!