동적 SQL
동적 SQL은 실행 시점에 SQL 문장을 문자열로 조립해 실행하는 방식이다. 검색 조건이 사용자 입력에 따라 달라지는 화면에서 주로 쓰인다. 정적 SQL과 달리 문법 오류가 실행 시점에 드러나는 것이 특징이다. 동적 SQL은 문자열을 준비하고 실행하는 두 단계로 처리…
주요 장면
대본
정의
동적 SQL은 실행 시점에 SQL 문장을 문자열로 조립해 실행하는 방식이다.
검색 조건이 사용자 입력에 따라 달라지는 화면에서 주로 쓰인다.
정적 SQL과 달리 문법 오류가 실행 시점에 드러나는 것이 특징이다.
실행 흐름
동적 SQL은 문자열을 준비하고 실행하는 두 단계로 처리된다.
PREPARE는 문자열을 구문 분석하고 번역해 실행 가능한 중간 코드로 만든다.
EXECUTE는 준비된 문을 바인드 값과 함께 실행해 결과를 받는다.
정적과 동적 비교
정적 SQL과 동적 SQL은 SQL 문장이 확정되는 시점이 다르다.
정적 SQL은 컴파일 시점에, 동적 SQL은 실행 시점에 문법을 검증한다.
동적 SQL의 대가는 문자열이 바뀔 때마다 새로 파싱되는 비용이다.
바인드 변수
동적 SQL에서 값을 문자열에 그대로 이어 붙이면 SQL 인젝션에 노출된다.
입력값이 구문의 일부로 해석되어 의도하지 않은 SQL이 실행될 수 있다.
값은 USING 절로 넘기는 바인드 변수가 원칙이다. 골격이 같아 커서가 공유된다.
조건 조합 예
조건 세 개가 각각 사용 여부에 따라 달라지면 조합은 2의 3제곱인 8가지다.
정적 SQL로 8개를 모두 두면 유지보수가 어렵다. 동적 SQL은 골격 1개로 같은 기능을 낸다.
필요한 조건만 이어 붙여 문장 수를 크게 줄인다.
정리
동적 SQL의 문제점은 실행 시점 오류, SQL 인젝션, 실행 계획 관리 세 축이다.
대응의 기본은 바인드 변수 사용과 입력값 검증이다.
권한은 애플리케이션 역할이나 중간 계층으로 완화한다.
권한이 확실하지 않으면 영구 테이블의 DML은 동적으로 만들지 않는 것이 안전하다.