четверг, 18 августа 2011 г.

Скрипт поиска строки по всей базе MySQL

Коллеги попросили помочь написать для них скрипт, который бы позволял искать во всех текстовых полях MySQL базы заданную строку (например IP адрес).
Ниже привожу результат своих трудов.
Скрипт написан и протестирован для версии MySQL 5.1.x и на других версиях может не работать (!)

USE testdb;
SET @table_schema = 'testdb';

DROP PROCEDURE IF EXISTS Scan;

DELIMITER //
CREATE PROCEDURE Scan(IN searchString varchar(50))
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE tableName VARCHAR(64);
    DECLARE tablesCursor CURSOR FOR
        SELECT
            table_name
        FROM
            information_schema.tables
        WHERE
            table_type = 'BASE TABLE'
            AND table_schema = @table_schema;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN tablesCursor;

tablesCursorLoop: LOOP
    FETCH tablesCursor INTO tableName;
    IF done = TRUE THEN LEAVE tablesCursorLoop; END IF;

    CALL ScanColumns(tableName, searchString);

    END LOOP tablesCursorLoop;
    CLOSE tablesCursor;
END//


DROP PROCEDURE IF EXISTS ScanColumns;
CREATE PROCEDURE ScanColumns(
    IN tableName varchar(64),
    IN searchString varchar(50))
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE columnName VARCHAR(64);

    DECLARE columnsCursor CURSOR FOR
        SELECT
            column_name
        FROM
            information_schema.columns
        WHERE
            table_schema = @table_schema
            AND table_name = tableName;


    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN columnsCursor;
columnsCursorLoop: LOOP
    FETCH columnsCursor INTO columnName;
    IF done = TRUE THEN LEAVE columnsCursorLoop; END IF;

    SET @fromWhere = CONCAT(
        ' FROM ',
        tablename,
        ' WHERE ',
        columnName,
        ' like "',
        searchString,
        '"'
    );

    SET @exists = CONCAT(
        'SELECT * ',
        @fromWhere
    );

    SET @stmtQuery = CONCAT(
        'SELECT CONCAT("Found ", count(*), " at ',
        tablename,
        '.',
        columnName,
        '") as " " ',
        @fromWhere,
        ' AND EXISTS (',
        @exists,
        ')'
    );


    PREPARE stmt FROM @stmtQuery;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    END LOOP columnsCursorLoop;
    CLOSE columnsCursor;
END//

DELIMITER ;



CALL Scan("1.2.3.4");


DROP PROCEDURE IF EXISTS Scan;
DROP PROCEDURE IF EXISTS ScanColumns;



Комментариев нет:

Отправить комментарий