sqlLiteralSubstitution 특성

애플리케이션이 같은 구문을 공유하고 포함되어 있는 리터럴 값만 다른 여러 SQL문을 실행하는 경우 pureQuery가 리터럴 값에 대한 매개변수 마커를 대체하게 하여 해당 명령문을 캡처하고 통합할 수 있습니다. 그러면 사용자 애플리케이션이 이 SQL문을 정적으로 실행하여 정적 SQL의 보안 및 속도 이점을 얻을 수 있습니다.

예를 들어, 애플리케이션은 구문적으로 동일하지만 양식 필드에서 사용자가 제공하는 리터럴 값을 포함하는 INSERT문을 생성할 수 있습니다.

보통, 명령문은 런타임 시 생성되므로 정적으로 명령문을 실행할 수 없습니다. 하지만 pureQuery 클라이언트 최적화는 리터럴 값을 매개변수 표시문자로 대체하고 SQL문의 구문이 이미 캡처된 명령문의 구문과 동일한 경우를 인식해서 이와 같은 명령문을 캡처할 수 있습니다. 따라서 이 SQL문을 DB2® 패키지에 바인드할 수 있습니다.

클라이언트 최적화 특성 executionModeSTATIC으로 설정된 애플리케이션을 실행할 때 pureQuery는 캡처한 매개변수화된 SQL문에 SQL문을 일치시킬 수 있습니다. 일치하는 명령문은 정적으로 실행됩니다. 일치하는 명령문은 데이터베이스에서 실행됩니다.

애플리케이션이 SQL문을 동적으로 실행하는 경우 매개변수 표시문자로 대체된 리터럴로 캡처된 명령문을 실행하는 보안의 이점을 얻을 수 있습니다. pureQuery Runtime 특성 capturedOnly의 값을 TRUE로 설정하십시오.

이 주제의 섹션

예제

SQL문을 캡처하기 전에 클라이언트 최적화 특성을 설정할 때 다음 예와 같이 특성 sqlLiteralSubstitutionENABLE로 설정하십시오.

pdqProperties=captureMode (ON), executionMode (DYNAMIC), 
pureQueryXml	(C:/workspace/capture_file.pdqxml), 
sqlLiteralSubstitution (ENABLE)

애플리케이션이 다음 예의 첫 번째 명령문과 유사한 INSERT문을 실행하는 경우, pureQuery는 두 번째 명령문의 양식으로 이 명령문을 캡처합니다.

insert into EMPLOYEES/*inserting new row into EMPLOYEES table*/values('Dong','Margaret',NULL,60000,12)

insert into EMPLOYEES values(?,?,?,?,?)
주: CLI 애플리케이션 환경에서는 NULL이 매개변수 표시문자로 대체되지 않으며 SQL문 내의 주석이 제거되지 않습니다.

명령문 캡처를 완료한 후 capture_file.pdqxml 파일에 대해 Configure 유틸리티를 실행한 후 StaticBinder 유틸리티를 실행하여 DB2 패키지에 명령문을 바인드할 수 있습니다.

STATIC으로 설정된 executionMode 특성으로 애플리케이션을 실행하고 애플리케이션이 insert into EMPLOYEES values('Hinkis','Tali','R',68000,20) 명령문을 실행하는 경우, pureQuery는 명령문을 pureQueryXML 파일의 매개변수화된 버전에 일치시키고 이를 정적으로 실행합니다.

그러나 capture_file.pdqxml 파일에 있는 매개변수화된 명령문과는 SQL문을 일치시키지 않도록 pureQuery에 지시할 수 있습니다. 응용프로그램을 실행하기 전에, executionMode를 STATIC으로 설정할 때 sqlLiteralSubstitution을 DISABLE로 설정할 수도 있습니다. 사용자가 애플리케이션을 실행하고 애플리케이션이 이전 단락에서 INSERT문을 발행하는 경우, pureQuery의 명령문 실행 여부는 capturedOnlyallowDynamicSQL 클라이언트 최적화 특성의 값에 따라 결정됩니다.

sqlLiteralSubstitution 특성의 값 설정

다음 테이블은 sqlLiteralSubstitution 특성의 값과 SQL문을 캡처할 때의 효과를 나열합니다. 테이블은 또한 이 특성의 값을 설정하지 않을 경우 발생하는 사항도 보여줍니다.

표 1. sqlLiteralSubstitution 특성의 값을 설정하거나 설정하지 않을 경우의 효과
처음 명령문을 캡처하는 경우의 효과 점차적으로 캡처하는 경우의 효과 애플리케이션을 STATIC 또는 DYNAMIC 모드에서 실행하는 경우의 효과
ENABLE pureQuery는 리터럴 값을 매개변수 표시문자로 교체합니다.

pureQuery는 또한 원래 SQL문에 대한 스택 추적도 캡처합니다. pureQuery가 모든 원래 SQL문의 스택 추적을 캡처하게 하려면 maxStackTracesCaptured 특성의 값을 증가시켜야 할 수도 있습니다. 1

pureQuery는 maxNonParmSQL 특성의 값에 대해 원래 SQL문을 계산하지 않습니다.

pureQuery가 SQL문을 매개변수화할 수 없고 로그 레벨이 FINE 또는 FINER인 경우 경고 메시지를 로깅합니다. 로그된 경고 메시지에 대한 정보는 SQL 리터럴 대체의 내용을 참조하십시오.
효과는 SQL문을 처음 캡처하는 경우와 동일합니다. pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일에 있는 매개변수화된 SQL문과 일치시키려고 합니다. 2
DISABLE pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다. pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다. pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일에 있는 매개변수화된 SQL문과 일치시키지 않습니다.
NOT_SET(또는 지정 안함) pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다. pureQuery가 지정된 pureQueryXML 파일에서 명령문을 마지막으로 캡처할 때 값이 ENABLE인 경우, pureQuery는 가능한 경우 리터럴 값을 매개변수 표시문자로 교체합니다.

값이 DISABLE 또는 NOT_SET인 경우, pureQuery는 리터럴 값을 매개변수 표시문자로 교체하지 않습니다.
pureQuery가 지정된 pureQueryXML 파일에서 명령문을 마지막으로 캡처할 때 값이 ENABLE인 경우, pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일의 매개변수화된 SQL문과 일치시키려고 합니다.

값이 DISABLE or NOT_SET인 경우 pureQuery는 애플리케이션이 실행하려고 하는 SQL문을 pureQueryXML 파일의 매개변수화된 SQL문과 일치시키지 않습니다.
주:
  1. 특성 maxStackTracesCaptured 및 스택 추적은 CLI 애플리케이션 환경에서 지원되지 않습니다.
  2. pureQuery Runtime이 매개변수화된 SQL문을 pureQueryXML 파일과 일치시킬 수 없는 경우, pureQuery Runtime의 동작은 captureMode 특성의 값에 따라 달라집니다.
    • captureMode의 값이 ON이고 pureQuery Runtime에서 SQL문에 리터럴 대체가 지원된다고 판별하는 경우, pureQuery는 매개변수화된 SQL문을 실행하고 캡처합니다.
    • captureMode의 값이 OFF인 경우, pureQuery Runtime은 pureQueryXML 파일에서 원래(매개변수화되지 않은) SQL문을 찾습니다. pureQuery Runtime이 명령문을 실행하거나 예외를 표시합니다. pureQuery 조치는 파일에서 명령문을 찾는지 여부와 pureQuery Runtime 특성 allowDynamicSQLcapturedOnly의 값에 따라 달라집니다.

    pureQueryXML 파일을 지정하지 않고 SQL문 리터럴 대체를 사용하는 경우 명령문을 실행하기 전에 pureQuery Runtime이 SQL문의 리터럴 값을 매개변수 표시문자로 대체합니다. SQL문을 캡처하고 pureQueryXML 파일을 작성할 필요가 없습니다. 명령문은 동적으로 실행되며 정적으로 실행할 필요가 없습니다. 그러나 capturedOnlyexecutionMode와 같은 pureQueryXML 파일이 필요한 기타 pureQuery Runtime 옵션을 사용할 수 없습니다.

캐스팅

버전 2.2.0.1에서부터는, pureQuery Runtime이 리터럴 값을 매개변수 표시문자로 대체할 때 두 가지 유형의 캐스팅을 지원합니다.

Cast 함수에서 매개변수의 SQL 리터럴 대체는 CLI 애플리케이션 환경에서 지원되지 않습니다.

CAST 함수
SQL문이 CAST 함수를 사용하여 리터럴 값을 데이터 유형에 캐스트하는 경우 pureQuery는 해당 값을 매개변수 표시문자로 대체합니다.

예를 들어, 명령문에 WHERE mySMALLINTcolumn=CAST(99 as INTEGER), the value 99절이 포함되어 있는 경우 값 99는 명령문 캡처 시 매개변수 표시문자가 됩니다.

또 다른 예로, CAST(6 as DECIMAL(7,3)) CAST 함수를 사용하는 경우 6만 명령문 캡처 시 매개변수 표시문자가 됩니다.

이름이 CAST인 사용자 정의 외부 스칼라 함수는 지원되지 않습니다.

내재된 캐스팅
pureQuery Runtime은 문자열과 Datetime 상수 간에 내재된 캐스팅을 수행합니다.
문자열을 날짜 및 시간 상수로 변환
INSERT INTO DEPARTMENT VALUES(1,5,56,'000010','A00','aa','2008-09-09')

pureQuery Runtime은 기타 유형의 내재된 캐스팅을 수행하지 않습니다.

SQL 리터럴 대체

DB2 CLI 및 IBM Data Server Driver 사용법 참고

DB2 CLI(Call Level Interface) 또는 IBM Data Server Driver를 pureQuery 런타임에 사용하는 경우 pureQuery Runtime 특성을 구성 키워드로 사용할 수 있습니다.

IBM CLI 키워드 구문
sqlLiteralSubstitution = ENABLE | DISABLE | NOT_SET
IBM Data Server Driver 구성 구문
<parameter name="sqlLiteralSubstitution" value="ENABLE | DISABLE | NOT_SET" />
.NET 연결 문자열 키워드에 대한 해당 IBM Data Server Provider
N/A

pureQueryXML 파일 없이 SQL 리터럴 대체 사용

pureQueryXML 파일을 지정하지 않고 SQL 리터럴 대체를 사용할 수 있습니다. SQL문을 캡처하고 pureQueryXML 파일을 작성할 필요가 없습니다. 명령문은 동적으로 실행되며 정적으로 실행할 필요가 없습니다.

다음 샘플 db2dsdriver.cfg 구성 파일은 sqlLiteralSubstitution 키워드를 사용할 수 있도록 설정하며 pureQueryXml 키워드를 포함하지 않습니다.
<configuration>
  <dsncollection>
    <dsn alias="sample",name="sample",host="server1.test.com", port="50001">
      <parameter name="sqlLiteralSubstitution", value="ENABLE"/>
    </dsn>
  </dsncollection>
  <databases>
    <database name="sample", host=" server1.test.com", port="50001">
    </database>
  </databases>
</configuration>
pureQuery 클라이언트 최적화에 사용 가능한 CLI 애플리케이션의 경우 명령문을 동적으로 실행하려고 시도하기 전에 pureQuery Runtime이 SQL문의 리터럴 값을 매개변수 표시문자로 대체합니다.

피드백