2010-03-04 5 views
3

저는 MySQL을 처음 접했고 여러 가지 레거시 데이터베이스에 추가하고자하는 스토어드 프로 시저를 가지고 있습니다. 나는 SQLyog를 사용하고 있으며 연결의 각 데이터베이스를 반복하고 저장 프로 시저를 실행하기 위해 'application_ %'(데이터베이스는 application_clientName라고하며 수십 가지가 있음)와 일치하는 경우 루프를 반복합니다.MySQL : 데이터베이스를 순환하여 스토어드 프로 시저를 실행하십시오.

SQLyog를 통해 저장하고 실행할 수있는 스크립트가 이상적입니다.

저는 SHOW DATABASES의 모든 데이터베이스를 루프 처리하고 이름이 'application_ %'와 같은 경우 명령문을 실행하려고합니다. 명령문은 해당 데이터베이스에 일반 저장 프로 시저를 작성합니다.

답변

4

그래, 테이블에있는 information_scheme 데이터베이스의 테이블에는 모든 데이터베이스 목록이 포함되어 있습니다. 따라서, 당신이 절차를에 실행하려는 모든 데이터베이스의 목록을 얻기 위해, 당신은 할 수 있습니다 :

SELECT schema_name FROM information_schema.schemata 
WHERE schema_name LIKE 'application_%'; 

다음 단계는 절차의 일종으로이 일을하는 것입니다. 불행하게도, MySQL은 프로 시저를 생성하는 경우 동적으로 생성 된 SQL을 실행하는 것이 효율적이지 않습니다. 따라서 필자가 생각해 낸 순수 SQL 버전은 약간 지저분하다. 그것은 먼저 호출 후, '발전기'절차를 작성하고, 마지막으로 발전기의 결과를 실행에 온다 :

CALL create_procedures(); 

이 :

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 ; 

이 절차가 생성 된 후를, 프로 시저를 호출 모든 application_% 테이블에 대한 프로 시저를 만드는 데 필요한 SQL이 포함 된 단일 열을 출력합니다. 전체 열을 선택하고 (오히려 길어질 것입니다) 새 SQL 쿼리로 실행하십시오.

필자는 SQLyog를 한번도 사용해 본 적이 없지만 제대로 작동하지 않으면 MySQL의 명령 줄 인터페이스를 사용해야 할 수도 있습니다. (<dbname>는 사용자가 액세스 권한을 가진 모든 데이터베이스 수 있습니다) 적절한 값으로 <username><dbname>을 변경

mysql -u <username> -p --database=<dbname> -N -r -B <input.sql> proc.sql 
mysql -u <username> -p --database=<dbname> < proc.sql 

:

CALL create_procedures(); 

그런 다음 다음 명령을 실행합니다 : 첫째, 파일 포함 input.sql를 생성합니다. 오류가 발생하지 않으면 모든 데이터베이스에 대해 정의 된 저장 프로 시저가 있어야합니다.

+0

대단히 감사합니다. SQLyog에서이 작업을 수행하면 시간이 많이 절약됩니다. –

관련 문제