스토어드 프로 시저에서 동적 SQL을 피하려는 이유는 무엇입니까?


답변:


7

필요한 경우 동적 SQL을 사용하는 데 아무런 문제가 없습니다. 실제로 어떤 상황에서는 이것이 유일한 옵션입니다. 입력을 위생 처리하지 않으면 SQL 삽입으로 이어질 수 있으므로 예를 사용하지 않는 것이 좋습니다. 예를 들어 호출되는 모듈에서 동적 SQL을 사용하면 성능에 해로울 수 있습니다.

나는 그 자체로 구체적인 예가 있다고 생각하지 않지만 나는 이것을 말할 것입니다 : 당신은 정기적 인 쿼리와 문장을 먼저 사용한 후에 무엇을 달성하려고 노력하십시오. 동적 SQL 문자열 실행은 호출하는 모듈에 대한 별도의 사용자 세션에서 수행되므로 예상하지 못한 권한 문제가 발생할 수 있습니다.

성능이 걱정된다면; 그것을 테스트하십시오. 보안이 걱정되는 경우 입력을 확인하십시오. 옳고 그름은 없습니다. 귀하가 당시에 이용할 수있는 정보와 도구를 바탕으로 최선의 판단을하는 것만입니다.


5

동적 SQL은 도구입니다. 그리고 도구로서 일부 응용 프로그램이 있습니다. 예를 들어 관리 작업의 경우 축복입니다.

생성 된 코드의 매개 변수화를 관리하지 않은 경우 특히 응용 프로그램에서 사용하는 SP에는 적합하지 않습니다 (최신 버전의 SQL Server에서는 문제가 줄어들었지만 여전히 유효합니다).

여기서는 자세하게 입력하지 않기 때문에 Dynamic SQL 문제에 대한 훌륭한 기사 인 MVP Erland Sommarskog 의 Dynamic SQL의 저주와 축복을 추천합니다.


1
나는 또한 그 링크를 공유하려고했는데, 동적 SQL 사용을 고려하는 사람이라면 누구나 읽어야합니다.
HLGEM

1

그것은 대부분의 dbms 기능과 같습니다. 올바른 상황에서 사용하면 제대로 작동하지만 잘못 된 상황에서는 제대로 작동하지 않습니다.

장점 : 어떤 것들은 그것 없이는 할 수 없습니다. 일반적으로 응용 프로그램 코드가 아닌 관리 작업에만 사용됩니다. 일부 시스템 명령에서는 매개 변수를 입력으로 사용할 수 없습니다. 예를 들어 알 수없는 데이터베이스가있는 많은 인스턴스에서 모든 데이터베이스에 대해 sproc을 통해 무언가를 실행해야하고 명령이 매개 변수를 허용하지 않으면 일반적으로 동적 SQL을 통해이를 해결합니다. 그러나 이것은 Sybase ASE에서 MSSQL보다 더 중요합니다.

단점 : 우리 모두 이미 알고 있다고 생각하기 때문에 많이 들어가지는 않지만 SQL 주입이 잘못 사용되면 약간의 위험이 있습니다. 나에게 가장 큰 것은 쿼리가 원래 쿼리와 동일하게 처리되고 컴파일 된 쿼리 계획의 일부가 아니라는 것입니다. 때때로 실행되는 무언가에 대해서는 별 문제가 없습니다. 분당 수백 번 실행되고 고유 한 SQL이 많은 경우에는 새롭고 잠재적으로 불필요 한 쿼리 계획이주기를 차지하고 계획 캐시의 유효 시간이 단축됩니다.


Sybase ASE에서 탁월한 응용 프로그램 사용은 피벗 할 값을 몰라도 피벗입니다. 저장된 proc에서 동적 SQL을 사용하여 수행 할 수 있지만 Sybase ASE는 쿼리로 직접 수행하는 구문을 지원하지 않습니다. 값을 알고 나면 데이터를 피벗하기 위해 쿼리를 작성할 수 있습니다.
richardcrossley

-7

동적 SQL을 사용하지 마십시오.

99 %의 저장 프로 시저에서 선택적 매개 변수를 사용하는 방법 에 대한 지식이 없기 때문에 Dynamic SQL이 사용되고 나머지 1 %는 고객이 이해하지 못하는 보고서에 대해 매우 복잡한 쿼리를 만드는 데 사용됩니다. 조차. Dynamic SQL의 저주와 축복은 왜 그것을 사용하는 것이 좋은지에 대한 예를 보여주지 않고 대신 SQL의 보안 위험을 언급하지 않고 디버깅, 유지 관리의 복잡성을 증가시키기 때문에 문제가 있음을 시사합니다. 사출, 성능 저하 때문이 아니라 캐시하지만 임시 테이블 및 커서를 사용처럼 함께 나쁜 관행 이는 물론의 게으른 하고 순진한프로그래머는 남용 할 것입니다. 그런 식으로 쿼리를 작성할 수있는 유연성과 같은 것은 없습니다. SQL은 선언적 언어이므로 처리해야합니다.

게으름은 모든 악의 근원입니다.

역설적으로이 답변은 가장 하향식 된 답변에서 순위를 매길 것입니다 .


이 기사는 실제로 동적 SQL에 대한 이상적인 사용 사례의 적어도 하나의 예를 제공하며 "그러한 방식으로 쿼리를 작성할 수있는 유연성과 같은 것은 없습니다 ..."는 사실이 아닙니다. 동적 SQL은이를 가능하게하는 것입니다 적응성.
LowlyDBA

선택적 매개 변수? 반 패턴을
포레스트

@LowlyDBA이 기사는 최소한 하나의 예를 제공합니다. 가장 간단한 SELECT, 그 문제를 해결하는 데 어떤 복잡한 문제가 있습니까? 순진한 프로그래머에게는 유연성이 필요합니다.
Ivanzinho

@ 포레스트 왜 "반 패턴"이라고 부르나요? 당신이 결코 제공하지 링크는, 또한 결코 쇼 얼마나 개선 논리 (이 경우 해당 쿼리 결국 될 것입니다 유지의 눈덩이 효과에 비해 크지 않을 것이다) 동적 SQL에 다시 후에 만들어진 말한다 때문에
Ivanzinho을

이것은 (빈약 한) 의견 기반 답변 IMHO입니다. 설명하는 문제에 대한 구체적인 예를 제공하지 않았으며 동적 SQL을 사용하는 전문가를 정의하지도 않았습니다.
George.Palacios
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.