更改存储过程定义器

时间:2010-07-08 18:36:18

标签: mysql stored-procedures

我的MySQL数据库中有大约一百个存储例程,其中大多数都有'root'作为定义器。

我有另一个名为'abc'的mysql帐户,如何将所有例程的定义者更改为'abc'。

如果我只能以'abc'用户身份访问MySQL服务器而不是'root',那么是否可以这样做

6 个答案:

答案 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 ;