2011-01-21 44 views
1

是否有任何方法可以一次輕鬆創建多個MySQL數據庫上的存儲過程?所有的數據庫都在同一個MySQL安裝。在多個數據庫上安裝存儲過程

+0

當你說「多個數據庫」,你的意思是「多個模式」?您可以在任何模式中安裝單個存儲過程,並利用其他模式,假定該架構上的該用戶的權限尚未被撤銷。 – kvista 2011-01-21 01:00:52

+0

我將我的常用過程保存在mysql模式中,並使用## call mysql.some_sp(); – shantanuo 2011-01-21 05:20:17

回答

0

我會建議做一個複製粘貼,並在每個數據庫模式中創建存儲過程,如果他們只需要該模式。否則,我會按照'Kelly Vista'的建議進行操作,只需引用位於其中一個架構中的存儲過程即可。

2

在所有模式

安裝要獲取模式列表,使用show databases;。與-- use結合本:

use schemaA; 
-- use schemaB; 
-- use schemaC; 

create procedure ... 

通過手動模式重複,刪除並取消註釋use條款,當您移動時,檢查一切順利。在MySQL Workbench中,Ctrl + Shift + Enter是你的朋友。

模式中的一個子集安裝程序

通常你不想安裝存儲程序中所有架構的服務器上,但只有在 ---常常被定義這套模式已經安裝了一些特定的存儲例程。然後,as discussed on SO,你可以使用這樣的查詢來獲得相關模式的名稱:

SELECT ROUTINE_SCHEMA FROM `information_schema`.`ROUTINES` where specific_name = 'MyRoutine'; 

驗證

部署程序後,以驗證他們的存在,你可以使用查詢像這樣:

SELECT distinct 
    r1.ROUTINE_SCHEMA, 
    case when r2.specific_name is not null then '' else '####' end as RoutineName1, 
    case when r3.specific_name is not null then '' else '####' end as RoutineName2, 
    case when r4.specific_name is not null then '' else '####' end as RoutineName3 
FROM 
    `information_schema`.`ROUTINES` as r1 
LEFT JOIN (select * from `information_schema`.`ROUTINES` where specific_name = 'RoutineName1') as r2 on r1.routine_schema = r2.routine_schema 
LEFT JOIN (select * from `information_schema`.`ROUTINES` where specific_name = 'RoutineName2') as r3 on r1.routine_schema = r3.routine_schema 
LEFT JOIN (select * from `information_schema`.`ROUTINES` where specific_name = 'RoutineName3') as r4 on r1.routine_schema = r4.routine_schema 
where 
    r1.specific_name = 'FilteringRoutineName'; 

這個查詢將檢查是否RoutineName1RoutineName2RoutineName3在服務器上的數據庫模式,因爲他們日常存在FilteringRoutineName。如果缺少例程,將會標記爲####

當然,這只是檢查例行的存在。爲了驗證它們的實現,你可能需要一個數據庫比較工具(比如MySQL Compare或類似的工具)。

1

假設您正在使用Linux,帶有一組模式名稱的簡單BASH循環將允許您執行此操作。

將您的過程定義保存到一個文件(例如myproc.sql),然後在循環中將該文件用作mysql的輸入。如果您將登錄詳細信息放入〜/ .my.cnf中,則還可以避免在cmdline上放置用戶名和密碼。

for i in dbname1 dbname2 dbname3; do mysql ${i} < myproc.sql; done; 
相關問題