Коллеги попросили помочь написать для них скрипт, который бы позволял искать во всех текстовых полях MySQL базы заданную строку (например IP адрес).
Ниже привожу результат своих трудов.
Скрипт написан и протестирован для версии MySQL 5.1.x и на других версиях может не работать (!)
Ниже привожу результат своих трудов.
Скрипт написан и протестирован для версии 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;
Комментариев нет:
Отправить комментарий