Drop all stored procedures in MySQL or using temporary stored procedures
是否有一个声明可以删除MySQL中的所有存储过程?
或者(如果第一个不可能),MySQL中是否存在临时存储过程? 类似于临时表的东西?
-
嗨,虽然这听起来很有趣:))但它是我从MS SQL Server(msdn.microsoft.com/en-us/library/aa174792(SQL.80).aspx)借来的东西,它说"SQL Server 2000也支持临时 与断开表一样的存储过程在断开连接时会自动删除。" 但我的目的是在会话结束后删除所有内容,尽管我仍然有备份计划,比如使用语言循环存储过程名称并逐个删除它们(没有检查是否可能)。
-
@ebyrob - 你说得对。 MySQL不支持匿名的过程代码块。 我的评论反映了Oracle DBMS的无效传输,它允许执行任意过程代码而无需定义永久存储过程
我本以为会这样做,但我愿意改正:
(已编辑以包含评论中提供的优点)
(正如Balmipour在下面的评论中指出的那样,指定数据库是个好主意。)
我认为想要删除给定数据库中的所有过程是有效的,否则在漫长的开发周期中存在过时的过程和函数累积并使所有事情变得混乱的危险。
-
适合我!实施起来要简单得多!! :)
-
@ user1070300我担心这会破坏所有程序,包括与你的数据库无关的MySQL程序,以及所有基础上的程序,如果你的服务器上有几个程序。请考虑在此请求中添加"WHERE db LIKE ",因为它看起来非常危险。
-
@Balmipour一个好点,虽然它不再回答原始请求,这是一个可以删除MySQL中所有存储过程的语句。
-
mysql.proc仍然是5.7中与MySQL元信息交互的可行方法吗?这个命令看起来比读取information_schema.ROUTINES和生成动态SQL命令更方便。
-
此外,最好在任何不信任的删除之前运行select:SELECT * FROM mysql.proc WHERE db LIKE 'yourDbName';
-
另请参见stackoverflow.com/questions/49276518/…
由于DROP PROCEDURE和DROP FUNCTION不允许子选择,我认为可能通过另一个存储过程执行操作,但唉,MySQL不允许存储过程丢弃其他存储过程。
无论如何,我试图通过创建预准备语句来欺骗MySQL,从而将drop调用与存储过程分开,但我没有运气。
因此,我唯一的贡献是这个select语句,它创建了删除所有存储过程和函数所需的语句列表。
1 2 3
| SELECT
CONCAT('DROP ',ROUTINE_TYPE ,' `',ROUTINE_SCHEMA ,'`.`',ROUTINE_NAME ,'`;') as stmt
FROM information_schema.ROUTINES ; |
-
这将为所有可用的数据库模式创建掉落功能。小心使用!
这似乎放弃了程序......但不确定其含义
-
另请参见stackoverflow.com/questions/49276518/…
我几乎可以使用一段代码来删除所有存储过程,但我认为MySQL不允许我在存储过程之外使用LOOP或CURSOR。
我可以编写一个SQL文件来计算给定模式的存储过程的数量,我有代码来遍历表并删除过程,但是我无法运行它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| |
-
感谢有助于未来用户的想法!我不确定如何解决光标/循环上的这个问题......
-
@Kenston:我最终编写了一个MySQL脚本,输出将删除过程的SQL - 因此可以将输出传送回mysql。
-
大!谢谢你的跟进!
我使用select语句显示一个单元格中特定数据库的所有Drop Procedure语句。然后将其复制到查询窗口。
1 2 3 4 5 6
| 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 ; |
在select语句之后创建了删除所有存储过程和函数所需的语句列表。您可以避免手动复制粘贴列出的查询,如下所示:
1 2 3 4 5
| 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运行它,但这对其他人来说仍然有用。
-
人们忽视评??论包括我,他们也不太引人注意。
@ user1070300的答案似乎有效,但看起来它可以放弃很多东西。
一个快速的DESC mysql.proc;让我在我的请求中添加了一个WHERE,以便备份已经存在的MySQL程序,当然,我没有理由放弃。
我执行了DELETE FROM mysql.proc WHERE db NOT LIKE 'mysql';
如果您有几个基础并且只想定位一个,请改用DELETE FROM mysql.proc WHERE db LIKE '';
顺便说一句,如果像我一样,你完全清理你的数据库,还需要删除你的表,你可以使用这个linux shell脚本:
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e"drop table $table" DATABASE_NAME; done
(有关详细信息,请参阅在一个命令中截断MySQL数据库中的所有表?)
在一个命令中截断MySQL数据库中的所有表?
-
如果要清除整个数据库,是不是更容易删除并重新创建模式?
-
@manatax当然可能是,但是当我不记得它们时,我想我有充分的理由不使用这种方法。缺少这样做的权利可能是一个。不想搞砸其他数据库设置是另一回事。 (我怀疑用户会受到影响,但我肯定会有一些方面)。我不玩那个足以给你一个更准确的答案,无论如何,我的答案的主要目的是:不要盲目删除所有内容,添加一个where声明! (我很高兴答案被编辑以考虑到这一点)