Mysql 在多个数据库上安装存储过程

Mysql 在多个数据库上安装存储过程,mysql,stored-procedures,Mysql,Stored Procedures,有没有办法一次在多个MySQL数据库上轻松创建存储过程?所有数据库都在同一个MySQL安装上。我建议在每个数据库架构中进行复制粘贴并创建存储过程(如果它们需要仅对该架构可用)。否则,我将遵循“Kelly Vista”的建议,只参考其中一个模式中的存储过程。在所有模式中安装 要获得模式列表,请使用showdatabases。将此与结合使用--: use schemaA; -- use schemaB; -- use schemaC; create procedure ... 手动迭代模式,在继

有没有办法一次在多个MySQL数据库上轻松创建存储过程?所有数据库都在同一个MySQL安装上。

我建议在每个数据库架构中进行复制粘贴并创建存储过程(如果它们需要仅对该架构可用)。否则,我将遵循“Kelly Vista”的建议,只参考其中一个模式中的存储过程。

在所有模式中安装

要获得模式列表,请使用
showdatabases。将此与
结合使用--

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

create procedure ...
手动迭代模式,在继续操作时删除和取消注释
use
子句,检查是否一切正常。在MySQL工作台中,Ctrl+Shift+Enter是您的朋友

在模式子集中安装例程

通常,您不希望在服务器上的所有模式中安装存储例程,而只希望在子集中安装存储例程——通常由已经安装了特定存储例程的模式集定义。然后,您可以使用如下查询获取相关架构的名称:

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'; 
此查询将检查服务器上具有例程
过滤器grouptinename
的数据库架构中是否存在
RoutineName1
RoutineName2
RoutineName3
。如果某个例程丢失,它将被标记为
####


当然,这只是检查常规存在。为了验证它们的实现,您可能需要一个数据库差异工具(例如MySQL Compare或类似工具)。

假设您使用的是Linux,一个简单的BASH循环和一组模式名称将允许您这样做

将过程定义保存到一个文件(例如myproc.sql),然后将该文件用作循环中mysql的输入。如果将登录详细信息放在~/.my.cnf中,还可以避免在cmdline上输入用户名和密码

for i in dbname1 dbname2 dbname3; do mysql ${i} < myproc.sql; done;
dbname1 dbname2 dbname3中的i的
;执行mysql${i}
当你说“多个数据库”时,你是指“多个模式”吗?您可以在任何模式中安装单个存储过程,并从其他模式中利用它,前提是该用户在该模式上的权限尚未被撤销。我将常用过程保存在mysql模式中,并使用##call mysql.some_sp()使用它;如果可能的话,可能值得研究使用存储过程的复制。我曾尝试将其自动化,但似乎不可能,因为迭代循环不能在MySQL的存储例程之外使用,和
CREATE PROCEDURE
语句不能在存储的例程中使用。可以使用执行带
EXECUTE
来解决此问题。稍后我将对此进行探讨,并更新我的答案以反映任何新发现。不幸的是,如果您试图在准备好的语句中使用
CREATE PROCEDURE
,则会得到错误代码:1295。准备好的语句协议尚不支持此命令。根据一个例子,Lua脚本语言可能很有用。