2010-04-01 4 views
0

이것은 모든 데이터베이스, 테이블 및 열을 검색하는 저장 프로 시저입니다. 이 절차는 오류없이 작성되었습니다.Mysql 저장 프로 시저를 호출 할 때 오류가 발생했습니다.

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `mydb`.`get_table`$$ 

CREATE DEFINER=`root`@`%` PROCEDURE `get_table`(in_search varchar(50)) 
    READS SQL DATA 
BEGIN 
DECLARE trunc_cmd VARCHAR(50); 
DECLARE search_string VARCHAR(250); 
DECLARE db,tbl,clmn CHAR(50); 
DECLARE done INT DEFAULT 0; 
DECLARE COUNTER INT; 
DECLARE table_cur CURSOR FOR 
SELECT concat('SELECT COUNT(*) INTO @CNT_VALUE FROM ', 
       table_schema,'.', table_name, 
       ' WHERE ', column_name,' REGEXP ''',in_search,'''' 
     ) 
,table_schema,table_name,column_name 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA NOT IN ('mydb','information_schema'); 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 
# #Truncating table for refill the data for new search. 
PREPARE trunc_cmd FROM 'TRUNCATE TABLE temp_details'; 
EXECUTE trunc_cmd ; 
OPEN table_cur; 
table_loop:LOOP 
FETCH table_cur INTO search_string,db,tbl,clmn; 
# #Executing the search 
SET @search_string = search_string; 
SELECT search_string; 
PREPARE search_string FROM @search_string; 
EXECUTE search_string; 
SET COUNTER = @CNT_VALUE; 
SELECT COUNTER; 
IF COUNTER>0 THEN 
# # Inserting required results from search to table 
INSERT INTO temp_details VALUES(db,tbl,clmn); 
END IF; 
IF done=1 THEN 
LEAVE table_loop; 
END IF; 
END LOOP; 
CLOSE table_cur; 
# #Finally Show Results 
SELECT * FROM temp_details; 
END$$ 

DELIMITER ; 

그러나이 절차를 호출하면 오류가 발생합니다.

call get_table('aaa') 

오류 코드 : 1064 당신은 SQL 구문에 오류가있다; 라인 1 에서 'AAA'REGEXP 삭제 '를 근처 를 사용할 수있는 권리 구문에 대한 MySQL 서버에 버전에 해당하는 설명서를 확인

답변

1

이 경우 "삭제"않습니다 (0 MS 촬영)에서 온? 그 이름을 가진 column_name을 가지고 있습니까? 그렇다면, 더 나은 이름, 예약되지 않은 것들을 사용하거나 불쾌한 역 따옴표`또는 ANSI 따옴표를 사용하여 "열 이름 주위에.이 같은

구조물은 SQL 주입에 취약하다.

+0

그나마 어디 있는지"에서 온다 "삭제 적절한 이름을 시도했지만 같은 오류가 발생합니다. 또한 백틱과 ANSI 따옴표를 사용하지 않아도 문제를 해결하지 못했습니다. – devuser

관련 문제