簡體   English   中英

MySQL 8-刪除特定數據庫中的所有存儲過程

[英]MySQL 8 - Remove All Stored Procedures in a Specific Database

在MySQL 8中,數據庫表mysql.proc不存在。 以前,我使用此表刪除/刪除/清除所有存儲過程,並從源版本控制代碼重新創建它們。 這樣可以很好地確保開發存儲過程在投入生產之前已保存到源版本控制中。

在8之前的MySQL版本中,此SQL查詢有效。

從``mysql''。`proc`那里刪除,其中`type` ='PROCEDURE'和`db` ='test';

是否有另一種方法可以在一條語句中獲得查詢結果?


答案是你做不到。 但是您可以生成所有drop語句並執行它們。

現在,我使用以下SQL為存儲過程,存儲函數,事件和觸發器創建所有drop語句。 我使用函數“ DATABASE()”來簡化重用。 您可以將“ DATABASE()”替換為數據庫名稱字符串“ dbName”,它將在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();

嘗試

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

在MySQL 8.0中,可通過INFORMATION_SCHEMARoutines表訪問存儲過程(例程)的詳細INFORMATION_SCHEMA 以下幾點值得注意:

ROUTINES表提供有關存儲例程(存儲過程和存儲函數)的信息。 ROUTINES表不包含內置SQL函數或用戶定義函數(UDF)。

現在,在此處必須使用“例程”表中的以下兩列:

ROUTINE_SCHEMA例程所屬的架構(數據庫)的名稱。

ROUTINE_TYPE -PROCEDURE用於存儲過程,FUNCTION用於存儲函數。

使用SHOW CREATE TABLE information_schema.routines進一步調查后,發現它是TEMPORARY TABLE

因此,為了刪除test數據庫的所有存儲過程(而不是存儲函數),我們可以使用以下查詢:

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

我建議使用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/

我認為您的問題的答案是,這不可能一次完成。

使用以下語句生成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';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM