2010-06-12 144 views
14

是否有可以刪除MySQL中所有存儲過程的語句? 另外(如果第一個是不可能的),是否有這樣的事情在MySQL臨時存儲過程?類似於臨時表的東西?刪除MySQL中的所有存儲過程或使用臨時存儲過程

+0

嗨,雖然這聽起來很可笑:)),但它的東西,我從MS SQL服務器借用(http://msdn.microsoft.com/en-us/library/aa174792(SQL.80).aspx)其中說「SQL Server 2000還支持臨時存儲過程,就像臨時表一樣,當您斷開連接時,它們會自動刪除。」但是我的目的是在會話結束後將所有內容都刪除,儘管我仍然有備份計劃,比如使用語言循環存儲過程名稱並逐個刪除它們(沒有檢查是否可能)。 – 2010-06-12 08:07:29

+0

@ebyrob - 你說得很對。 MySQL不支持程序代碼的匿名塊。我的意見反映Oracle數據庫管理系統無效轉移,它確實允許執行任意程序代碼而不定義永久存儲過程。 – APC 2017-01-31 17:50:28

回答

19

由於DROP PROCEDURE和DROP FUNCTION不允許子選擇,我想這可能是可能通過另一個存儲過程來執行操作,但很可惜,MySQL不允許存儲過程將其他存儲過程。

無論如何我嘗試了通過創建準備好的語句,因而從存儲過程有些分離掉話欺騙MySQL來此,但我有沒有運氣。

因此,因此我唯一的貢獻是創造刪除所有存儲過程和函數所需的語句列表SELECT語句。

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

這將爲所有可用的數據庫模式創建刪除功能。謹慎使用! – Dasun 2013-06-07 16:34:57

3

我可以幾乎獲得工作的一段代碼刪除所有存儲的特效,但我認爲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; 
+0

感謝這將幫助未來用戶的想法!我不確定這個問題在光標/循環上應該如何解決...... – 2010-11-14 04:11:58

+0

@Kenston:我最終編寫了一個輸出SQL的MySQL腳本,它將刪除特效 - 所以輸出可以傳回到mysql。 – phyzome 2011-01-10 02:20:56

+0

太棒了!感謝您的跟進! – 2011-01-17 15:27:49

21

我本來以爲,這將做到這一點,但我願意更正:

(編輯以合併的意見提供了很好的點)

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

(正如指出OUT b y Balmipour在下面的評論中,這是一個好主意,指定數據庫)

我認爲它是有效的要刪除給定的數據庫中的所有程序,否則在一個長的開發週期中存在過時的程序和功能的危險積聚和混淆一切。

+0

適合我!實施起來更簡單! :) – 2014-04-05 03:22:16

+1

@ user1070300我擔心這會破壞所有程序,**包括與您的數據庫無關的MySQL的**,以及所有基地的程序,如果您的服務器上有多個程序。請考慮在此請求中添加「WHERE db LIKE 」,因爲**看起來相當危險**。 – Balmipour 2016-04-06 21:10:49

+0

@Balmipour一個很好的觀點,儘管它不再回答原始請求,這是一個可以刪除MySQL中的所有存儲過程的語句。 – user1070300 2016-04-09 09:48:22

1

在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; 
+0

感謝你的想法,儘管這應該已經作爲評論到被接受的答案。我實際上使用Java來運行它,但這對其他人仍然有用。 – 2012-04-11 11:29:14

+0

人們忽視評​​論包括我,他們也不是很明顯。 – 2013-09-02 05:17:16

8

這似乎是下降的程序......不知道,雖然

DELETE FROM mysql.proc WHERE db = 'Test' AND type = 'PROCEDURE'; 
0

@ user1070300的答案似乎工作的影響,但它看起來可以降低很多東西。

一個快速的DESC mysql.proc;讓我給我的請求添加一個WHERE,以便免除現有的MySQL程序,當然我沒有理由放棄。

我執行DELETE FROM mysql.proc WHERE db NOT LIKE 'mysql';
如果您有多個基地並且只想定位一個基地,請改爲使用DELETE FROM mysql.proc WHERE db LIKE '<yourDbName>';

順便說一句,如果你像我一樣被完全清除數據庫,還需要放棄你的表,你可以使用這個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?

+0

如果您要清除整個數據庫,那麼放棄並重新創建您的模式不是更容易嗎? – Manatax 2017-04-11 23:03:06

+0

@manatax當然可能,但我不記得他們,我想我有很好的理由不使用這種方法。沒有權利這樣做可能是一個。不想混淆其他數據庫設置是另一回事。 (我懷疑用戶會受到影響,但我相信一些方面會)。我不會玩足以給你一個更準確的答案,無論如何,我的答案的主要目的是:**不要盲目刪除所有內容,添加一個'where語句!**(我很高興答案被編輯以考慮到這一點) – Balmipour 2017-04-12 15:21:49

0

我使用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;