【发布时间】:2011-03-13 12:26:30
【问题描述】:
我的 MySQL 数据库中有大约 100 个存储例程,其中大多数以“root”作为定义器。
我有另一个mysql账户名为'abc',如何将所有例程的定义器更改为'abc'。
如果我只能以“abc”用户而不是“root”身份访问 MySQL 服务器,是否可以这样做
【问题讨论】:
我的 MySQL 数据库中有大约 100 个存储例程,其中大多数以“root”作为定义器。
我有另一个mysql账户名为'abc',如何将所有例程的定义器更改为'abc'。
如果我只能以“abc”用户而不是“root”身份访问 MySQL 服务器,是否可以这样做
【问题讨论】:
查看定义器:
show procedure status;
你可以这样改变它们:
UPDATE `mysql`.`proc` p SET definer = 'YournewDefiner' WHERE definer='OldDefinerShownBefore'
例如:
UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'
小心,因为这会改变所有数据库的所有定义器。
【讨论】:
sis@% PROCEDURE SP_Login() 如何删除 DEFINER?请帮我解决这个问题,我在过去 2 天里头晕目眩。
update mysql.proc 方法确实有效。
mysql.proc p SET definer = 'user@%' WHERE definer ='root@%' 和 db = 'my_database';
您可以根据所需的表/数据库更新 mysql.proc 表中的定义器...
update mysql.proc set definer='root@localhost' where name='t_p';
【讨论】:
t_p 是存储过程的名称。
据我所知: 您必须获取所有脚本文本并将它们删除/重新创建为 abc。除非 abc 有权删除/创建过程,否则您将无法作为 abc 执行此操作。
【讨论】:
导出数据库<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 更改。然后我重命名原始数据库并使用原始数据库的名称创建一个新数据库。只需使用新的定义器信息导入修改后的导出文件即可。我喜欢这个解决方案,因为如果事情发生横向变化,它会给我一个后备。如果某些东西不起作用,请删除您创建的数据库并重命名副本。
【讨论】:
我有这个问题终于用下面的方法解决了。 我收到此错误:将数据插入表时出现 1449。 解决方案:转到触发器选项,用户必须先定义一些驱动器,然后才能从那里放置它们。 就是这样,你得到了解决方案,现在你可以在 phpmydmin 中对表进行操作
【讨论】:
改为使用简单的方法,创建一个用户(abc),该用户的所有权限和连接字符串中的所有权限,连接
与 abc。会更好,mysql版本8不支持mysql.proc
【讨论】:
alter procedure old_proc_name
delimiter //
create PROCEDURE new_proc_name (parameter)
begin
Your Sql Statement;
end//
delimiter ;
【讨论】: