다음을 통해 공유


Assert 실행 계획 연산자

Assert 연산자는 조건을 확인합니다. 예를 들어 참조 무결성을 확인하거나 스칼라 하위 쿼리에서 한 개의 행을 반환하게 합니다. Assert 연산자는 각 입력 행에 대해 실행 계획의 Argument 열의 식을 계산합니다. 이 식이 NULL이면 Assert 연산자를 통해 행이 전달되고 쿼리 실행을 계속합니다. 이 식이 NULL이 아니면 해당 오류가 발생합니다.

Assert 연산자는 물리 연산자입니다.

Assert 연산자 아이콘그래픽 실행 계획 아이콘

1. CHECK 제약 조건의 유효성 검사

다음 예에서는 Employee 테이블에서 지정한 직원의 ID에 대해 Gender 열의 값을 업데이트합니다. 테이블에는 열에 'F' 및 'M' 값만 허용하는 CHECK 제약 조건이 있습니다. 쿼리 실행 계획의 출력에서는 쿼리 최적화 프로그램이 Assert 연산자를 사용하여 CHECK 제약 조건에 대해 UPDATE 문에서 지정한 값의 유효성을 검사하고 제약 조건의 조건이 충족되지 않을 때 오류를 발생시킴을 보여 줍니다.

USE AdventureWorks2008R2;
GO
SET NOCOUNT ON;
GO
SET SHOWPLAN_ALL ON;
GO
UPDATE HumanResources.Employee
SET Gender = 'X' WHERE BusinessEntityID = 1;
GO
SET SHOWPLAN_ALL OFF;
GO

Assert 연산자의 실행 계획 출력을 아래에 표시합니다.

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN upper([AdventureWorks2008R2].[HumanResources].[Employee].[Gender])<>N'F' AND 
upper([AdventureWorks2008R2].[HumanResources].[Employee].[Gender])<>N'M' THEN 
    (0) ELSE NULL END)

2. FOREIGN KEY 제약 조건의 유효성 검사

다음 예에서는 Person.Person 테이블에서 행을 삭제합니다. 이 경우 이 테이블의 BusinessEntityID 열에 대한 외래 키 참조가 있는 6개 테이블이 있습니다. 쿼리 실행 계획의 출력에서는 쿼리 최적화 프로그램이 Assert 연산자를 사용하여 이러한 각 제약 조건에 대해 DELETE 문의 유효성을 검사함을 보여 줍니다.

USE AdventureWorks2008R2;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
DELETE Person.Person WHERE BusinessEntityID = 1209;
GO
SET SHOWPLAN_ALL OFF;
GO

Assert 연산자의 실행 계획 출력을 아래에 표시합니다.

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN NOT [Expr1030] IS NULL THEN (0) ELSE CASE WHEN NOT 
[Expr1031] IS NULL THEN (1) ELSE CASE WHEN NOT [Expr1032] IS NULL THEN 
(2) ELSE CASE WHEN NOT [Expr1033] IS NULL THEN (3) ELSE CASE WHEN NOT 
[Expr1034] IS NULL THEN (4) ELSE CASE WHEN NOT [Expr1035] IS NULL THEN (5) ELSE NULL END END END END END END)

3. 스칼라 하위 쿼리의 유효성 검사

다음 예에서는 쿼리의 WHERE 절에 하위 쿼리를 사용합니다. 이 예에서는 의도적으로 여러 행을 반환하는 하위 쿼리를 사용하여 Assert 연산자에서 오류가 발생하도록 강제 적용합니다. 쿼리 실행 계획의 출력에서는 쿼리 최적화 프로그램이 Assert 연산자를 사용하여 SELECT 문에서 지정한 하위 쿼리에서 하나의 행만 반환되도록 함을 보여 줍니다.

USE AdventureWorks2008R2;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
SELECT BusinessEntityID 
FROM HumanResources.Employee
WHERE BusinessEntityID = (SELECT BusinessEntityID FROM Person.Person);
GO
SET SHOWPLAN_ALL OFF;
GO
-- Run the query again to display the error message raised by the 
-- Assert Operator.
SELECT BusinessEntityID 
FROM HumanResources.Employee
WHERE BusinessEntityID = (SELECT BusinessEntityID FROM Person.Person);
GO

Assert 연산자의 실행 계획 출력을 아래에 표시합니다.

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN [Expr1007]>(1) THEN (0) ELSE NULL END)