Хорошо, похоже, таблица SCHEMATA в базе данных information_scheme
содержит список всех баз данных. Таким образом, чтобы получить список всех баз данных, на которых вы хотите запустить процедуру, вы можете сделать:
SELECT schema_name FROM information_schema.schemata
WHERE schema_name LIKE 'application_%';
Следующим шагом будет проработка этой процедуры. К сожалению, MySQL не справляется с выполнением динамически сгенерированного SQL, если он требует создания процедур. Таким образом, версия на чистом SQL, которую я придумал, немного грязная. Все сводится к тому, чтобы сначала создать процедуру «генератора», затем вызвать ее и, наконец, выполнить результат генератора:
delimiter //
DROP PROCEDURE IF EXISTS create_procedures//
CREATE PROCEDURE create_procedures()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE db VARCHAR(255);
DECLARE appDBs CURSOR FOR SELECT schema_name FROM information_schema.schemata WHERE schema_name LIKE 'application_%';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SET @procName = "simpleproc"; -- Change this to your proc name
SET @output = "delimiter //";
OPEN appDBs;
REPEAT
FETCH appDBs INTO db;
IF NOT done THEN
-- Replace this procedure declaration with your procedure.
-- Make sure to keep the ',db,' syntax there.
-- You should really only have to change the parameters
-- and the stuff between the BEGIN and END clauses.
SET @output = CONCAT(@output,'
DROP PROCEDURE IF EXISTS ',db,'.',@procName,'//
CREATE PROCEDURE ',db,'.',@procName,'()
BEGIN
SELECT 1;
END//');
END IF;
UNTIL done END REPEAT;
CLOSE appDBs;
SET @output = CONCAT(@output,'\ndelimiter ;');
SELECT @output AS procs;
END//
delimiter ;
После того, как эта процедура сгенерирована, вызовите процедуру:
CALL create_procedures();
Будет выведен один столбец, содержащий SQL, необходимый для создания процедур для всех таблиц application_%
. Выделите весь столбец (он будет довольно длинным) и выполните его как новый SQL-запрос.
Я никогда не использовал SQLyog, но если это не работает должным образом, вам, возможно, придется использовать интерфейс командной строки MySQL. Сначала создайте файл input.sql
, содержащий:
CALL create_procedures();
Затем выполните следующие команды:
mysql -u <username> -p --database=<dbname> -N -r -B < input.sql > proc.sql
mysql -u <username> -p --database=<dbname> < proc.sql
изменение <username>
и <dbname>
на соответствующие значения (<dbname>
может быть любой базой данных, к которой у вас есть права доступа). Если вы не столкнетесь с какими-либо ошибками, то для каждой базы данных должны быть определены хранимые процедуры.