>데이터 베이스 >MySQL 튜토리얼 >SQL Server Management Studio가 때때로 하위 쿼리에서 구문 유효성 검사를 우회하는 이유는 무엇입니까?

SQL Server Management Studio가 때때로 하위 쿼리에서 구문 유효성 검사를 우회하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-20 01:12:09273검색

Why Does SQL Server Management Studio Sometimes Bypass Syntax Validation in Subqueries?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.