집 >데이터 베이스 >MySQL 튜토리얼 >SQL Server Management Studio가 때때로 하위 쿼리에서 구문 유효성 검사를 우회하는 이유는 무엇입니까?
SQL Server Management Studio: 예기치 않은 하위 쿼리 동작
SSMS(SQL Server Management Studio)는 잘못된 필드를 참조하는 하위 쿼리가 포함된 쿼리를 처리할 때 때때로 예기치 않은 동작을 나타냅니다. SSMS는 일반적으로 구문 유효성 검사를 수행하지만 특정 상황에서는 놀랍게도 이러한 오류를 간과하여 개발자에게 혼란을 야기할 수 있습니다.
다음 예를 고려해보세요.
<code class="language-sql">delete from Photo where hs_id in (select hs_id from HotelSupplier where id = 142)</code>
이 쿼리는 Photo
에서 선택하는 하위 쿼리에서 발견된 hs_id
값을 기반으로 HotelSupplier
테이블에서 항목을 삭제하는 것을 목표로 합니다. 그러나 HotelSupplier
에는 hs_id
필드가 없습니다. 대신 hs_key
을 사용합니다.
흥미롭게도 이 쿼리는 독립적으로 실행할 때 하위 쿼리 자체가 실패함에도 불구하고 SSMS에서 오류 없이 실행되는 경우가 많습니다.
<code class="language-sql">select hs_id from HotelSupplier where id = 142</code>
설명
SSMS의 동작은 정규화되지 않은 열 참조를 처리하는 데서 비롯됩니다. hs_id
참조는 하위 쿼리가 아닌 외부 쿼리(Photo
)에 속하는 것으로 해석됩니다. 이는 가장 바깥쪽 범위 내부에서 정규화되지 않은 열 이름을 해결하는 규칙을 따릅니다.
하위 쿼리는 명시적으로 열을 선택하지 않으므로 SSMS는 효과적으로 쿼리를 다음과 같이 다시 작성합니다.
<code class="language-sql">delete from Photo where Photo.hs_id in (select * from HotelSupplier where id = 142)</code>
하위 쿼리가 행을 반환하는 경우(여기서와 마찬가지로) Photo
가 NULL이 아닌 hs_id
의 모든 행을 삭제합니다. 하위 쿼리의 비어 있지 않은 결과 집합으로 인해 IN
절은 NULL이 아닌 값에 대해 true로 평가됩니다.
핵심 요약
직관에 반하는 것처럼 보이는 이 동작은 SQL 쿼리에서 정규화된 열 이름(예: HotelSupplier.hs_key
)을 사용하는 것의 중요성을 강조합니다. 이렇게 하면 모호성을 방지하고 예측 가능한 쿼리 실행을 보장하여 예기치 않은 데이터 삭제나 기타 의도하지 않은 결과를 방지할 수 있습니다.
위 내용은 SQL Server Management Studio가 때때로 하위 쿼리에서 구문 유효성 검사를 우회하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!