我在MySQL数据库中有大约一百个存储例程,其中大多数都将“root”作为定义者。
我有另一个名为“abc”的mysql帐户,如何将所有例程的定义者更改为“abc”。
如果我只以“abc”用户身份访问MySQL服务器而不是“root”,是否可能执行相同操作?
我在MySQL数据库中有大约一百个存储例程,其中大多数都将“root”作为定义者。
我有另一个名为“abc”的mysql帐户,如何将所有例程的定义者更改为“abc”。
如果我只以“abc”用户身份访问MySQL服务器而不是“root”,是否可能执行相同操作?
查看定义者:
show procedure status;
您可以像这样更改它们:
UPDATE `mysql`.`proc` p SET definer = 'YournewDefiner' WHERE definer='OldDefinerShownBefore'
例如: UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'
要小心,因为这将更改所有数据库的定义者。
您可以在mysql.proc表中更新定义程序的数据库/表...
update mysql.proc set definer='root@localhost' where name='t_p';
导出数据库<DB>
的所有存储过程:
mysqldump --single-transaction --no-data --no-create-info --routines \
--skip-triggers <DB> >routines.sql
编辑 routines.sql
并重新创建它们:
cat routines.sql | mysql <DB>
如有必要,请指定-u
和-p
开关。
我通过导出数据库,用文本编辑器(不是文字处理软件)打开导出的文件,并进行查找和替换来完成大规模的Definer更改。将新的Definer替换为旧的Definer。然后,我重命名原始数据库并创建一个具有原始数据库名称的新数据库。只需使用新的Definer信息导入修改后的导出文件即可完成操作。我喜欢这个解决方案,因为它给了我一个备选方案,如果出现问题,可以删除创建的数据库并重命名副本。
不要使用复杂的方法,创建一个名为abc的用户,授予该用户所有权限,并在连接字符串中连接到abc。这样会更好,mysql版本8不支持mysql
.proc
我之前遇到了这个问题,最后用以下方法解决了它。 当我往表格中插入数据时,出现了错误代码1449。 解决方法:进入触发器选项卡,看看有没有一些由用户定义的触发器,如果有就从列表中删除它们。 这样就可以在phpmyadmin中对表格进行操作了。
你也可以这样做:
update mysql.proc set definer = "root@localhost" where db = "mydatabase";
alter procedure old_proc_name
delimiter //
create PROCEDURE new_proc_name (parameter)
begin
Your Sql Statement;
end//
delimiter ;
UPDATE
更改了表格,但mysqldump
没有看到它:mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES
。即使重启了mysql
,问题仍然存在。我正在运行mysql-5.5.31
。 - x-yuriupdate mysql.proc
方法确实可行。 - x-yurimysql
.proc
p SET definer = 'user@%' WHERE definer='root@%' and db = 'my_database'; - user3856437