MySQL: перебирать базы данных и запускать на них хранимую процедуру - PullRequest
3 голосов
/ 04 марта 2010

Я очень плохо знаком с MySQL, и у меня есть хранимая процедура, которую я хотел бы добавить в несколько устаревших баз данных.Я использую SQLyog, и я хотел бы перебрать каждую базу данных на соединении и, если она соответствует «application_%» (базы данных называются application_clientName, их десятки), для запуска хранимой процедуры.

AСценарий, который я могу сохранить и запустить через SQLyog, был бы идеальным.

Я стараюсь просмотреть все базы данных в SHOW DATABASES и выполнить оператор, если их имя LIKE 'application_%'.Оператор создаст общую хранимую процедуру в этой базе данных.

1 Ответ

4 голосов
/ 04 марта 2010

Хорошо, похоже, таблица 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> может быть любой базой данных, к которой у вас есть права доступа). Если вы не столкнетесь с какими-либо ошибками, то для каждой базы данных должны быть определены хранимые процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...