删除特定数据库中的所有存储过程

nxagd54h  于 2021-06-18  发布在  Mysql
关注(0)|答案(4)|浏览(392)

在mysql 8中,数据库表mysql.proc不存在。以前,我使用此表删除/删除/清除所有存储过程,并从源版本代码中重新创建它们。这可以很好地确保开发存储过程在进入生产之前保存到源版本控制中。 在8之前的mysql版本中,此sql查询有效。 从“mysql”中删除“proc”,其中“type='procedure'和“db`='test';
有没有其他方法可以在一条语句中实现查询结果?

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

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

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();
mnemlml8

mnemlml81#

在mysql 8.0中,存储过程(例程)的详细信息可以通过 INFORMATION_SCHEMA . 以下几点值得注意:
例程表提供有关存储例程(存储过程和存储函数)的信息。routines表不包括内置sql函数或用户定义函数(udf)。
现在,这里需要使用routines表中的以下两列: ROUTINE_SCHEMA -例程所属的架构(数据库)的名称。 ROUTINE_TYPE -存储过程的过程,存储函数的函数。
关于进一步利用 SHOW CREATE TABLE information_schema.routines ,发现它是一个临时表
因此,为了删除 test 数据库中,我们可以使用以下查询:

DELETE FROM information_schema.routines 
WHERE routine_type = 'PROCEDURE' AND 
      routine_schema = 'test'
ryevplcw

ryevplcw2#

我建议使用mysql shell-以下示例使用python模式:

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/ .

9nvpjoqh

9nvpjoqh3#

我认为你的问题的答案是,这不能在一个声明中完成。
使用以下语句生成drop语句列表可能会有所帮助:

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';
wnvonmuf

wnvonmuf4#

尝试

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

相关问题