【问题标题】:Drop all stored procedures in MySQL or using temporary stored procedures删除 MySQL 中的所有存储过程或使用临时存储过程
【发布时间】:2010-06-12 07:07:23
【问题描述】:

有没有可以删除MySQL中所有存储过程的语句? 或者(如果第一个不可能),MySQL中是否有临时存储过程之类的东西?类似于临时表的东西?

【问题讨论】:

  • 嗨,虽然听起来很有趣 :)) 但这是我从 MS SQL Server (msdn.microsoft.com/en-us/library/aa174792(SQL.80).aspx) 那里借来的,它说“SQL Server 2000 还支持临时存储过程,就像临时表一样,断开连接时自动掉线。”但是我的目的是在会话结束后删除所有内容,尽管我仍然有备份计划,例如使用语言循环存储过程名称并将它们一一删除(尚未检查是否可能)。
  • @ebyrob - 你说的很对。 MySQL 不支持匿名程序代码块。我的 cmets 反映了来自 Oracle DBMS 的无效传输,它确实允许执行任意过程代码而不定义永久存储过程

标签: mysql stored-procedures


【解决方案1】:

我原以为这样就可以了,但我愿意更正:

(已编辑以纳入 cmets 中提供的一个好点)

delete from mysql.proc WHERE db LIKE <yourDbName>;

(正如 Balmipour 在下面的 cmets 中指出的那样,指定数据库是个好主意。)

我认为删除给定数据库中的所有过程是有效的,否则在漫长的开发周期中,过时的过程和函数可能会累积并混淆所有内容。

【讨论】:

  • 为我工作!实现起来简单多了!! :)
  • @user1070300 恐怕这会破坏所有的程序,包括 MySQL 的,它们与你的数据库无关,如果你有几个,所有基础的程序你的服务器。请考虑在此请求中添加“WHERE db LIKE ”,因为它看起来很危险
  • @Balmipour 好点,虽然它不再响应原始请求,这是一个可以删除 MySQL 中所有存储过程的语句。
  • mysql.proc 在 5.7 中仍然是与 MySQL 元信息交互的可行方法吗?这个命令当然看起来比读取information_schema.ROUTINES 和生成动态SQL 命令更方便。
  • 另外,在您不信任的任何删除操作之前运行选择是个好主意:SELECT * FROM mysql.proc WHERE db LIKE 'yourDbName';
【解决方案2】:

由于 DROP PROCEDURE 和 DROP FUNCTION 不允许子选择,我认为可以通过另一个存储过程执行操作,但是可惜 MySQL 不允许存储过程删除其他存储过程。

我试图通过创建准备好的语句来欺骗 MySQL,从而将 drop 调用从存储过程中分离出来,但我没有运气。

因此,我唯一的贡献是这个 select 语句,它创建了删除所有存储过程和函数所需的语句列表。

SELECT
    CONCAT('DROP ',ROUTINE_TYPE,' `',ROUTINE_SCHEMA,'`.`',ROUTINE_NAME,'`;') as stmt
FROM information_schema.ROUTINES;

【讨论】:

  • 这将为所有可用的数据库模式创建 DROP 功能。谨慎使用!
【解决方案3】:

这似乎放弃了程序......虽然不确定影响

DELETE FROM mysql.proc WHERE db = 'Test' AND type = 'PROCEDURE';
【解决方案4】:

几乎可以编写一段代码来删除所有存储的过程,但我认为 MySQL 不允许我在存储过程。

我可以编写一个 SQL 文件来计算给定模式的存储过程的数量,并且我有代码来遍历表并删除过程,但我无法让它运行:

SELECT COUNT(ROUTINE_NAME)
  INTO @remaining
  FROM information_schema.ROUTINES
  WHERE ROUTINE_SCHEMA = SCHEMA()
    AND ROUTINE_TYPE = 'FUNCTION';

kill_loop: LOOP
  IF @remaining < 1 THEN
    LEAVE kill_loop;
  END IF;
  SELECT ROUTINE_NAME
    INTO @cur_func_name
    FROM information_schema.ROUTINES
    WHERE ROUTINE_SCHEMA = SCHEMA()
      AND ROUTINE_TYPE = 'FUNCTION'
    LIMIT 1;
  DROP FUNCTION @cur_func_name;
  @remaining = @remaining - 1;
END LOOP;

【讨论】:

  • 感谢您的想法,这将有助于未来的用户!我不确定应该如何解决光标/循环上的这个问题...
  • @Kenston:我最终编写了一个 MySQL 脚本,输出 SQL 将删除 procs——因此输出可以通过管道传回 mysql。
  • 太棒了!感谢您的跟进!
【解决方案5】:

我使用 select 语句在一个单元格中显示特定数据库的所有 Drop Procedure 语句。然后将其复制到查询窗口。

SET group_concat_max_len = 4096;

SELECT GROUP_CONCAT(Procedures SEPARATOR '; ') From (SELECT CONCAT(
"DROP PROCEDURE IF EXISTS `",SPECIFIC_NAME, '`') AS Procedures 
FROM information_schema.ROUTINES R WHERE R.ROUTINE_TYPE = "PROCEDURE" 
AND R.ROUTINE_SCHEMA = 'my_database_name') As CopyThis; 

【讨论】:

    【解决方案6】:

    在创建删除所有存储过程和函数所需的语句列表的 select 语句之后。您可以避免手动复制粘贴列出的查询,如下所示:

    mysql>SELECT
        CONCAT('DROP ',ROUTINE_TYPE,' `',ROUTINE_SCHEMA,'`.`',ROUTINE_NAME,'`;') as stmt
    FROM information_schema.ROUTINES into outfile '/tmp/a.txt';
    
    mysql> source /tmp/a.txt;
    

    【讨论】:

    • 感谢您的想法,尽管这应该作为对已接受答案的评论。我实际上使用 Java 运行它,但这对其他人仍然有用。
    • 人们忽略了包括我在内的cmets,它们也不太引人注目。
    【解决方案7】:

    @user1070300 的回答似乎行得通,但看起来它可以丢掉很多东西。

    一个快速的DESC mysql.proc; 让我在我的请求中添加了一个 WHERE,以便节省已经存在的 MySQL 程序,当然,我没有理由放弃。

    我执行了DELETE FROM mysql.proc WHERE db NOT LIKE 'mysql'
    如果您有多个碱基并且只想定位一个,请改用DELETE FROM mysql.proc WHERE db LIKE '&lt;yourDbName&gt;'

    顺便说一句,如果你像我一样,完全清除了你的数据库并且还需要删除你的表,你可以使用这个 linux shell 脚本: mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done (详情请参阅Truncate all tables in a MySQL database in one command?

    Truncate all tables in a MySQL database in one command?

    【讨论】:

    • 如果要清除整个数据库,删除并重新创建架构不是更容易吗?
    • @manatax 当然可以,但是虽然我不记得它们,但我想我有充分的理由不使用这种方法。缺少这样做的权利可能是其中之一。不想弄乱其他数据库设置是另一回事。 (我怀疑用户会受到影响,但我确信某些方面会受到影响)。我没有玩到足以给你一个更准确的答案,但无论如何,我回答的主要目的是:不要盲目删除所有内容,添加where声明!(我'很高兴答案经过编辑以考虑到这一点)
    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 2018-03-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多