2011-09-30 4 views
11

고려 :변수를 기반으로 스키마를 선택하는 방법은 무엇입니까?

SET @PREFIX='DEV_'; 

SET @REFRESHDB=CONCAT(@PREFIX,'Refresh'); 

CREATE TABLE @REFRESHDB.`Metadata` 
(
    `Key` VARCHAR(30) NOT NULL, 
    `Value` VARCHAR(30) NOT NULL, 
    PRIMARY KEY (`Key`) 
) ENGINE = InnoDB; 

INSERT INTO @REFRESDB.`Metadata` (`Key`, `Value`) VALUES ("Version", "0"); 

이 유효하지 않는 것 : MySQL은 함께 다시 온다 :

당신은 당신의 SQL 구문에 오류가있다; 내가 제대로 the documentation에 따라 일을 한 적이 말할 수있는 올바른 구문은 지금까지 REFRESHDB.`Metadata`

@ '

을 근처에서 사용하는 MySQL 서버 버전에 해당하는 설명서를 확인. 그러나 MySQL은 허용되지 않는다고 말합니다. MySQL (식별자로 변수 사용을 허용하지 않음) 또는 다른 어떤 제한 사항입니까?

답변

3

문서 상태 :

"사용자 변수의 값을 할당 할 수 있습니다 정수, 십진수, 부동 소수점, 이진 또는 비 이진 문자열 또는 NULL 값 "

0 제한된 데이터 형식 집합

변수를 개체로 사용하려고합니다. 지원되지 않습니다.

+0

변수를 사용할 수있는 변수 컨트롤에 할당 할 수있는 방법이 표시되지 않습니다. –

+0

'@ REFRESHDB'의 값이 실제로는 문자열 값이 아니라 스키마 객체라는 것을 암시하는 객체로 사용하고 있습니다. –

+1

Downvoter는 관심이 있으십니까? –

8

이렇게하려면 prepare/dynamic sql을 사용해야합니다.

이 문서에서는 우수한 구체적으로이 두 가지를 넘어 :

http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html

이 시도 :

SET @PREFIX='DEV_'; 

SET @REFRESHDB=CONCAT(@PREFIX,'Refresh'); 

SET @st = CONCAT('CREATE TABLE ', @REFRESHDB,'.`Metadata` 
(
    `Key` VARCHAR(30) NOT NULL, 
    `Value` VARCHAR(30) NOT NULL, 
    PRIMARY KEY (`Key`) 
) ENGINE = InnoDB'); 

PREPARE tStmt FROM @s; 
EXECUTE tStmt; 


SET @s = CONCAT('INSERT INTO ', @PREFIX, '.`Metadata` (`Key`, `Value`) VALUES ("Version", "0")'); 

PREPARE stmt FROM @s; 
EXECUTE stmt; 
+0

만들기 TABLE 문이 실패합니다. –

+0

오, 나는 그것을 놓쳤다. 당신은 그것을 준비된 진술로 넣어야 할 것이다. 준비 테이블에 create 테이블을 넣도록 업데이트했습니다. –

+0

그 정정으로, 당신은 일을하고 있지만 이것을 구현하려는 사람은 보안 및 성능 고려 사항을 알고 있어야합니다. 동적 SQL은 약간의 흑인 예술 일 수 있습니다. –

0

난 당신이 저장 프로 시저를 작성 제안 :

DELIMITER $$ 
CREATE PROCEDURE (IN DBname varchar(255) 
       , IN AKey varchar(255) 
       , IN AValue varchar(255)) 
BEGIN 
    DECLARE query VARCHAR(1000); 
    -- First check the DBName against a list of allowed DBnames, 
    -- to prevent SQL-injection with dynamic tablenames. 

    DECLARE NameAllowed BOOLEAN; 
    SELECT 1 INTO NameAllowed WHERE DBName IN ('validDB1','validDB2'); 
    IF (NameAllowed = 1) THEN BEGIN 

    -- DBName is in the whitelist, it's safe to continue. 
    SET query = CONCAT('INSERT INTO ' 
         ,DBName 
         ,'.MetaData (`key`,`value`) values (?,?)); 
    -- note the use of parameter placeholders, to prevent SQL-injection. 
    PREPARE stmt FROM query; 
    EXECUTE stmt USING Akey, AValue; 
    DEALLOCATE PREPARE stmt; -- clears the query and its result from the cache. 
    END; END IF; 
END $$ 

DELIMITER ; 
+0

삽입이 아니라 CREATE TABLE 문에서 오류가 발생했습니다. –

관련 문제