首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL 8-删除特定数据库中的所有存储过程

MySQL 8-删除特定数据库中的所有存储过程
EN

Stack Overflow用户
提问于 2018-11-08 20:40:19
回答 3查看 1.7K关注 0票数 2

在MySQL 8中,数据库表mysql.proc不存在。在此之前,我使用此表删除/删除/清除所有存储过程,并从源代码版本代码中重新创建它们。这样可以很好地确保在投入生产之前将存储过程保存到源代码版本控制中。

在8岁之前的MySQL版本中,此SQL查询工作正常。

mysql.proc中删除type =‘type’和db = 'test';

是否有其他方法在一条语句中实现查询的结果?

答案是你不能,但是你可以生成所有的drop语句并执行它们。

现在,我使用以下SQL创建存储过程、存储函数、事件和触发器的所有drop语句。为了便于重用,我使用了函数"DATABASE()“。您可以将" database ()“替换为数据库名称字符串"dbName”,并且它将在phpMyAdmin中工作。

代码语言:javascript
复制
SELECT CONCAT("DROP ",`item`.`ROUTINE_TYPE`," IF EXISTS `",DATABASE(),"`.`",`item`.`ROUTINE_NAME`,"`;") as `stmt`
FROM `information_schema`.`ROUTINES` AS `item` 
WHERE `item`.`ROUTINE_SCHEMA` = DATABASE()
    UNION
SELECT CONCAT("DROP EVENT IF EXISTS `",DATABASE(),"`.`",`item`.`EVENT_NAME`,"`;") AS `stmt`
FROM `information_schema`.`EVENTS` AS `item` 
WHERE `item`.`EVENT_SCHEMA` = DATABASE()
    UNION
SELECT CONCAT("DROP TRIGGER IF EXISTS `",DATABASE(),"`.`",`item`.`TRIGGER_NAME`,"`;") AS `stmt`
FROM `information_schema`.`TRIGGERS` AS `item` 
WHERE `item`.`TRIGGER_SCHEMA` = DATABASE();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-04 02:38:10

我认为你的问题的答案是,这不能在一次发言中做到。

使用以下语句生成DROP语句列表可能会有所帮助:

代码语言:javascript
复制
SET group_concat_max_len = 4294967295;

SELECT group_concat('DROP PROCEDURE IF EXISTS ', r.routine_name, ';\n' ORDER BY r.routine_name SEPARATOR '') AS DROP_STATEMENTS 
FROM information_schema.routines r 
WHERE r.routine_schema = database() AND r.routine_type = 'PROCEDURE';
票数 0
EN

Stack Overflow用户

发布于 2018-12-02 21:08:06

我建议使用MySQL Shell -下面的示例使用模式:

代码语言:javascript
复制
mysqlsh> \py

mysql-py> i_s = session.get_schema("information_schema")

mysql-py> functions = i_s.ROUTINES \
       ->                .select("sys.quote_identifier(ROUTINE_SCHEMA) AS RoutineSchema", "sys.quote_identifier(ROUTINE_NAME) AS RoutineName") \
       ->                .where("ROUTINE_SCHEMA = 'db1' AND ROUTINE_TYPE = 'FUNCTION'").execute().fetch_all()

mysql-py> functions
[
    [
        "`db1`",
        "`func1`"
    ], 
    [
        "`db1`",
        "`func2`"
    ], 
    [
        "`db1`",
        "`func``3`"
    ]
]

mysql-py> for function in functions:
       ->     print(sql_fmt.format(*function))
       ->     session.sql(sql_fmt.format(*function)).execute()
       ->
DROP FUNCTION `db1`.`func1`
DROP FUNCTION `db1`.`func2`
DROP FUNCTION `db1`.`func``3`
Query OK, 0 rows affected (0.0684 sec)

有关更多的讨论,请参见https://mysql.wisborg.dk/2018/12/02/mysql-8-drop-several-stored-events-procedures-or-functions/

票数 0
EN

Stack Overflow用户

发布于 2018-11-08 21:28:47

试一试

代码语言:javascript
复制
   delete from mysql.proc WHERE db LIKE <yourDbName>;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53215801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档