我的MySQL数据库中有大约一百个存储例程,其中大多数都有'root'作为定义器。
我有另一个名为'abc'的mysql帐户,如何将所有例程的定义者更改为'abc'。
如果我只能以'abc'用户身份访问MySQL服务器而不是'root',那么是否可以这样做
答案 0 :(得分:83)
要查看定义器:
show procedure status;
您可以像这样更改它们:
UPDATE `mysql`.`proc` p SET definer = 'YournewDefiner' WHERE definer='OldDefinerShownBefore'
例如:
UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'
要小心,因为这会改变所有数据库的所有定义器。
答案 1 :(得分:9)
您可以根据所需的表/ db ...
更新mysql.proc表中的定义器update mysql.proc set definer='root@localhost' where name='t_p';
答案 2 :(得分:5)
据我所知: 您必须获取所有脚本文本并将其重新创建为abc。除非abc有权删除/创建过程,否则您将无法以abc身份执行此操作。
答案 3 :(得分:1)
导出数据库<DB>
的所有过程:
mysqldump --single-transaction --no-data --no-create-info --routines \
--skip-triggers <DB> >routines.sql
修改routines.sql
并重新创建它们:
cat routines.sql | mysql <DB>
如有必要,请指定-u
和-p
次。
答案 4 :(得分:0)
我已经完成了大规模Definer的更改,方法是导出数据库,在文本编辑器(不是文字处理程序)中打开导出的文件,然后查找并替换掉旧的Definer。然后,我重命名原始数据库,并使用原始数据库的名称创建一个新数据库。只需使用新的Definer信息导入修改后的导出文件,就可以完成。我喜欢这种解决方案,因为如果事情发生横向调整,它会给我一个后备。如果无法解决问题,请删除您创建的数据库并重命名副本。
答案 5 :(得分:-1)
alter procedure old_proc_name
delimiter //
create PROCEDURE new_proc_name (parameter)
begin
Your Sql Statement;
end//
delimiter ;