【问题标题】:Change the stored procedure definer更改存储过程定义器
【发布时间】:2011-03-13 12:26:30
【问题描述】:

我的 MySQL 数据库中有大约 100 个存储例程,其中大多数以“root”作为定义器。

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

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

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    查看定义器:

    show procedure status;
    

    你可以这样改变它们:

    UPDATE `mysql`.`proc` p SET definer = 'YournewDefiner' WHERE definer='OldDefinerShownBefore'
    

    例如:

     UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'
    

    小心,因为这会改变所有数据库的所有定义器。

    【讨论】:

    • “显示过程状态”对我不起作用,但更新确实有效。谢谢。
    • 默认情况下,当我在 mysql db 下的 godaddy 共享主机中创建存储过程时,会创建 DEFINER。示例:CREATE DEFINER=sis@% PROCEDURE SP_Login() 如何删除 DEFINER?请帮我解决这个问题,我在过去 2 天里头晕目眩。
    • 投了反对票,因为服务器没有注意到对表的直接操作。 (dev.mysql.com/doc/refman/5.5/en//…)
    • 我的错。我也有错误的定义者的观点。 update mysql.proc 方法确实有效。
    • 谢谢@bradmace,但实际上你可以使用 db = 'my_database' 来优化你的 SQL,所以完整的 SQL 将是 UPDATE mysql.proc p SET definer = 'user@%' WHERE definer ='root@%' 和 db = 'my_database';
    【解决方案2】:

    您可以根据所需的表/数据库更新 mysql.proc 表中的定义器...

    update mysql.proc set definer='root@localhost' where name='t_p';
    

    【讨论】:

    • 在这种情况下“t_p”是什么?
    • @posfan12 t_p 是存储过程的名称。
    【解决方案3】:

    据我所知: 您必须获取所有脚本文本并将它们删除/重新创建为 abc。除非 abc 有权删除/创建过程,否则您将无法作为 abc 执行此操作。

    【讨论】:

      【解决方案4】:

      导出数据库<DB>的所有程序:

      mysqldump --single-transaction --no-data --no-create-info --routines \
          --skip-triggers <DB> >routines.sql
      

      编辑 routines.sql 并重新创建它们:

      cat routines.sql | mysql <DB>
      

      如有必要,请指定 -u-p 开关。

      【讨论】:

        【解决方案5】:

        我已经通过导出数据库、在文本编辑器(不是文字处理器)中打开导出的文件并进行查找和替换来将新的 Definer 替换为旧的来完成大量的 Definer 更改。然后我重命名原始数据库并使用原始数据库的名称创建一个新数据库。只需使用新的定义器信息导入修改后的导出文件即可。我喜欢这个解决方案,因为如果事情发生横向变化,它会给我一个后备。如果某些东西不起作用,请删除您创建的数据库并重命名副本。

        【讨论】:

          【解决方案6】:

          我有这个问题终于用下面的方法解决了。 我收到此错误:将数据插入表时出现 1449。 解决方案:转到触发器选项,用户必须先定义一些驱动器,然后才能从那里放置它们。 就是这样,你得到了解决方案,现在你可以在 phpmydmin 中对表进行操作

          【讨论】:

            【解决方案7】:

            改为使用简单的方法,创建一个用户(abc),该用户的所有权限和连接字符串中的所有权限,连接

            与 abc。会更好,mysql版本8不支持mysql.proc

            【讨论】:

              【解决方案8】:
              alter procedure old_proc_name
              delimiter //
              create PROCEDURE new_proc_name (parameter)
              begin
               Your Sql Statement;
              end//
              delimiter ;
              

              【讨论】:

              • 多么不寻常的方式
              • 不是 MySQL 语法。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-29
              • 2010-11-17
              • 1970-01-01
              相关资源
              最近更新 更多