다음을 통해 공유


알림에 대한 쿼리 만들기

이 쿼리 알림 기능은 데이터베이스 엔진에서 인덱싱된 뷰를 유지 관리하기 위해 사용하는 변경 내용 감지 메커니즘을 기반으로 합니다. 쿼리 문에서 알림 기능을 사용하기 위한 요구 사항과 제한 사항은 인덱싱된 뷰의 요구 사항 및 제한 사항과 비슷합니다.

SET 옵션 설정

SELECT 문이 알림 요청에 따라 실행될 때 해당 요청을 제출하는 연결에는 연결 옵션이 다음과 같이 설정되어야 합니다.

  • ANSI_NULLS ON

  • ANSI_PADDING ON

  • ANSI_WARNINGS ON

  • CONCAT_NULL_YIELDS_NULL ON

  • QUOTED_IDENTIFIER ON

  • NUMERIC_ROUNDABORT OFF

  • ARITHABORT ON

[!참고]

데이터베이스 호환성 수준이 90으로 설정된 경우 ANSI_WARNINGS를 ON으로 설정하면 암시적으로 ARITHABORT가 ON으로 설정됩니다. 데이터베이스 호환성 수준이 80 이하로 설정된 경우에는 명시적으로 ARITHABORT 옵션을 ON으로 설정해야 합니다.

READ_UNCOMMITTED 또는 SNAPSHOT 격리 수준에서는 문을 실행하면 안 됩니다.

이러한 옵션이나 격리 수준이 제대로 설정되어 있지 않으면 SELECT 문이 실행된 바로 다음에 알림이 발생합니다. 알림이 활성화되면 알림을 일으키는 명령을 실행한 연결에 SET 옵션도 다음과 같이 설정되어 있어야 합니다. 그렇지 않으면 Transact-SQL 오류로 인해 명령이 실패합니다.

문이 저장 프로시저에 포함된 경우에는 저장 프로시저를 만들 때 ANSI_NULLS 옵션 및 QUOTED_IDENTIFIER 옵션이 설정되어야 합니다. 자세한 내용은 SET ANSI_NULLS (Transact-SQL)SET QUOTED_IDENTIFIER(Transact-SQL)를 참조하십시오.

알림을 위한 문

일반적으로 인덱싱된 뷰를 만드는 데 사용할 수 있는 쿼리에 대해 알림을 요청할 수 있습니다. 다음 문에 대해 알림을 설정할 수 있습니다.

  • SELECT

    SELECT와 관련된 요구 사항 및 제한 사항은 아래의 "지원되는 SELECT 문"을 참조하십시오. SELECT 문에 대한 자세한 내용은 SELECT(Transact-SQL)를 참조하십시오.

  • EXECUTE

    이 경우 SQL Server는 EXECUTE 문 자체보다는 실행된 명령에 대한 알림을 등록합니다. 명령은 SELECT 문의 요구 사항과 제한 사항을 따라야 합니다. EXECUTE 문에 대한 자세한 내용은 EXECUTE(Transact-SQL)를 참조하십시오.

알림을 등록하는 명령에 하나 이상의 문이 포함된 경우 데이터베이스 엔진은 일괄 처리에 있는 각 문에 대한 알림을 만듭니다.

지원되는 SELECT 문

다음 요구 사항을 만족하는 SELECT 문에 대해서는 쿼리 알림이 지원됩니다.

  • SELECT 문에 있는 예상 열은 명시적으로 표시되어야 하며 테이블 이름은 두 부분으로 구성된 이름으로 한정되어야 합니다. 즉, 문에서 참조되는 모든 테이블은 같은 데이터베이스에 있어야 합니다.

  • 문에서는 별표(*) 또는 table_name.* 구문을 사용하여 열을 지정할 수 없습니다.

  • 문에서는 명명되지 않은 열이나 중복된 열 이름을 사용할 수 없습니다.

  • 문에서는 기본 테이블을 참조해야 합니다.

  • 문에서는 계산 열이 있는 테이블을 참조하지 않아야 합니다.

  • 문에서 GROUP BY 식이 사용되지 않는 한 SELECT 문에 있는 예상 열에는 집계 식이 포함될 수 없습니다. GROUP BY 식이 제공된 경우 선택 목록에는 집계 함수 COUNT_BIG() 또는 SUM()이 포함될 수 있습니다. 하지만 Null 허용 열에 대해서는 SUM()이 지정되지 않습니다. 문에서는 HAVING, CUBE 또는 ROLLUP을 지정하지 않을 수 있습니다.

  • 간단한 식으로 사용되는 SELECT 문에 있는 예상 열은 두 번 이상 표시되지 않아야 합니다.

  • 문에는 PIVOT 또는 UNPIVOT 연산자가 포함되지 않아야 합니다.

  • 문에는 UNION, INTERSECT 또는 EXCEPT 연산자가 포함되지 않아야 합니다.

  • 문에서는 뷰를 참조하지 않아야 합니다.

  • 문에는 DISTINCT, COMPUTE 또는 COMPUTE BY나 INTO가 포함되지 않아야 합니다.

  • 문에서는 서버 전역 변수(@@variable_name)를 참조하지 않아야 합니다.

  • 문에서는 파생 테이블, 임시 테이블 또는 테이블 변수를 참조하지 않아야 합니다.

  • 문에서는 다른 데이터베이스 또는 서버로부터의 테이블이나 뷰를 참조하지 않아야 합니다.

  • 문에는 하위 쿼리, 외부 조인 또는 자체 조인이 포함되지 않아야 합니다.

  • 문에서는 큰 개체 유형인 text, ntext 및 image를 참조하지 않아야 합니다.

  • 문에서는 CONTAINS 또는 FREETEXT 전체 텍스트 조건자가 사용되지 않아야 합니다.

  • 문에서는 OPENROWSET 및 OPENQUERY를 비롯한 행 집합 함수가 사용되지 않아야 합니다.

  • 문에서는 AVG, COUNT(*), MAX, MIN, STDEV, STDEVP, VAR 또는 VARP와 같은 집계 함수가 사용되지 않아야 합니다.

  • 문에서는 등급 지정 및 기간 이동 함수와 같은 비결정적인 함수가 사용되지 않아야 합니다.

  • 문에는 사용자 정의 집계가 포함되지 않아야 합니다.

  • 문에서는 카탈로그 뷰와 동적 관리 뷰와 같은 시스템 테이블이나 뷰를 참조하지 않아야 합니다.

  • 문에는 FOR BROWSE 정보가 포함되지 않아야 합니다.

  • 문에서는 큐를 참조하지 않아야 합니다.

  • 문에는 변경 및 결과 반환이 불가능한(예: WHERE 1=0) 조건 문이 포함되지 않아야 합니다.

  • 문에서는 READPAST 잠금 힌트를 지정할 수 없습니다.

  • 문에서는 Service Broker 큐를 참조하지 않아야 합니다.

  • 문에서는 동의어를 참조하지 않아야 합니다.

  • 문에는 double/real 데이터 형식 기반의 비교 또는 식이 포함되지 않아야 합니다.

  • 문에서는 TOP 식이 사용되지 않아야 합니다.

일괄 처리 및 저장 프로시저

일괄 처리 및 저장 프로시저에 대해 구독을 요청하면 일괄 처리 또는 저장 프로시저 내에서 실행되는 각 문에 대해 별도의 구독 요청이 수행됩니다.

EXECUTE 문은 알림을 등록하지 않고 알림 요청을 실행된 명령으로 전달합니다. 일괄 처리인 경우 컨텍스트가 실행된 문에 적용되고 위에서 설명한 것과 같은 규칙이 적용됩니다.

중복 구독

중복 활성 구독을 제출하면 새로 지정한 제한 시간 값을 사용하여 기존 구독이 새로 만들어집니다. 중복 구독이란 다음 조건을 만족하는 구독입니다.

  • 동일한 사용자가 같은 데이터베이스 컨텍스트에서 쿼리를 제출합니다.

  • 같은 템플릿, 매개 변수 값, 알림 ID 및 배달 위치를 사용합니다.

즉, 동일한 쿼리에 대해 알림을 요청하면 알림이 한 개만 전송됩니다. 이는 일괄 처리에서 중복된 쿼리나 여러 번 호출된 저장 프로시저의 쿼리에 적용됩니다.

참고 항목

참조

개념