쿼리 알림 작업
적용 대상: SQL Server
쿼리 알림은 SQL Server 2005(9.x) 및 OLE DB Driver for SQL Server에서 도입되었습니다. SQL Server 2005(9.x)에 도입된 SQL Service Broker 인프라를 기반으로 하는 쿼리 알림을 사용하면 데이터가 변경될 때 애플리케이션에 알림을 받을 수 있습니다. 이 기능은 웹 애플리케이션과 같은 데이터베이스의 정보 캐시를 제공하고 원본 데이터가 변경될 때 알림을 받아야 하는 애플리케이션에 유용합니다.
쿼리 알림을 사용하면 쿼리의 기본 데이터가 변경될 때 지정된 시간 제한 기간 내에 알림을 요청할 수 있습니다. 요청은 서버에 대한 서비스 이름, 메시지 텍스트 및 시간 제한 값을 포함하는 알림 옵션을 지정합니다. 알림은 애플리케이션에서 사용 가능한 알림을 폴링할 수 있는 Service Broker 큐를 통해 전달됩니다.
쿼리 알림 옵션 문자열의 구문은 다음과 같습니다.
service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]
예시:
service=mySSBService;local database=mydb
알림 구독은 시작하는 프로세스보다 더 오래 있습니다. 애플리케이션이 알림 구독을 만든 다음 종료할 수 있기 때문입니다. 구독은 유효한 상태로 유지되며 지정된 시간 제한 기간 내에 데이터가 변경되면 알림이 발생합니다. 알림은 실행된 쿼리, 알림 옵션 및 메시지 텍스트로 식별됩니다. 시간 제한 값을 0으로 설정하여 취소할 수 있습니다.
알림은 한 번만 전송됩니다. 데이터 변경 내용을 지속적으로 알리려면 각 알림이 처리된 후 쿼리를 다시 실행하여 새 구독을 만듭니다.
OLE DB Driver for SQL Server 애플리케이션은 일반적으로 Transact-SQL RECEIVE 명령을 사용하여 알림을 받습니다. 이 명령을 사용하여 알림 옵션에 지정된 서비스와 연결된 큐에서 알림을 읽습니다.
참고 항목
알림이 필요한 쿼리에서 테이블 이름을 정규화해야 합니다. 예들 들어 dbo.myTable
입니다. 테이블 이름은 두 부분으로 구성된 이름으로 한정되어야 합니다. 3부 또는 4부로 구성된 이름을 사용하면 구독이 유효하지 않습니다.
알림 인프라는 SQL Server 2005(9.x)에 도입된 큐 기능을 기반으로 합니다. 일반적으로 서버에서 생성된 알림은 나중에 처리하기 위해 이러한 큐를 통해 전송됩니다.
쿼리 알림을 사용하려면 서버에 큐와 서비스가 있어야 합니다. 이러한 항목은 다음과 같이 Transact-SQL 명령을 사용하여 만들 수 있습니다.
CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])
참고 항목
서비스는 위와 같이 미리 정의된 계약을 사용해야 합니다.
SQL Server용 OLE DB 드라이버
OLE DB Driver for SQL Server는 행 집합을 수정할 때 소비자 알림을 지원합니다. 소비자는 모든 행 집합 수정 단계와 변경 시도에 대해 알림을 받습니다.
참고 항목
ICommand::Execute를 사용하여 서버에 알림 쿼리를 전달하는 것은 SQL Server용 OLE DB 드라이버를 사용하여 쿼리 알림을 구독하는 유일한 유효한 방법입니다.
DBPROPSET_SQLSERVERROWSET 속성 집합
OLE DB를 통해 쿼리 알림을 지원하기 위해 OLE DB Driver for SQL Server는 속성 집합에 DBPROPSET_SQLSERVERROWSET
다음과 같은 새 속성을 추가합니다.
속성 | 형식 | 설명 |
---|---|---|
SSPROP_QP_NOTIFICATION_TIMEOUT | VT_UI4 | 쿼리 알림이 활성 상태로 유지되는 시간(초)입니다. 기본값은 432,000초(5일)입니다. 최소값은 1초이고 최대값은 2^31-1초입니다. |
SSPROP_QP_NOTIFICATION_MSGTEXT | VT_BSTR | 알림의 메시지 메시지입니다. 이 텍스트는 사용자 정의이며 미리 정의된 형식이 없습니다. 기본적으로 문자열은 비어 있습니다. 1~2000자를 사용하여 메시지를 지정합니다. |
SSPROP_QP_NOTIFICATION_OPTIONS | VT_BSTR | 쿼리 알림 옵션입니다. 이러한 옵션은 이름=값 구문이 있는 문자열에 지정됩니다. 사용자는 서비스를 만들고 큐에서 알림을 읽을 책임이 있습니다. 기본값은 빈 문자열입니다. |
알림 구독은 항상 커밋됩니다. 문이 사용자 트랜잭션에서 실행되었는지 또는 자동 커밋에서 실행되었는지 또는 문이 실행된 트랜잭션이 커밋되거나 롤백되었는지에 관계없이 발생합니다. 서버 알림은 잘못된 알림 조건, 즉 기본 데이터 또는 스키마 변경이나 제한 시간에 도달한 경우 중 더 빠른 시간에 발생합니다.
알림 등록은 발생하자마자 삭제됩니다. 따라서 알림을 받을 때 애플리케이션에서 추가 업데이트를 가져오려는 경우 다시 구독해야 합니다.
다른 연결이나 스레드에서 알림의 대상 큐를 확인할 수 있습니다. 예시:
WAITFOR (RECEIVE * FROM MyQueue); -- Where MyQueue is the queue name.
참고 항목
SELECT *
는 큐에서 항목을 삭제하지 않습니다. 그러나 RECEIVE * FROM
은 삭제합니다. 큐가 비어 있으면 서버 스레드가 중단됩니다. 호출 시 큐 항목이 있는 경우 즉시 반환됩니다. 그렇지 않으면 큐 항목이 만들어질 때까지 호출이 대기합니다.
RECEIVE * FROM MyQueue
이 문은 큐가 비어 있는 경우 빈 결과 집합을 즉시 반환합니다. 그렇지 않으면 모든 큐 알림을 반환합니다.
null이 아니고 SSPROP_QP_NOTIFICATION_OPTIONS
비어 있지 않은 경우 SSPROP_QP_NOTIFICATION_MSGTEXT
위에 정의된 세 가지 속성이 포함된 쿼리 알림 TDS 헤더가 서버로 전송됩니다. 이 헤더는 명령이 실행될 때마다 전송됩니다. 둘 중 하나가 null이거나 비어 있는 경우 헤더가 전송되지 않고 DB_E_ERRORSOCCURRED
가 발생합니다(또는 속성이 모두 선택 사항으로 표시되는 경우 DB_S_ERRORSOCCURRED
가 발생함). 그런 다음 상태 값이 .로 설정됩니다 DBPROPSTATUS_BADVALUE
. 유효성 검사는 실행 및 준비 시 발생합니다. 마찬가지로 SQL DB_S_ERRORSOCCURED
Server 2005(9.x) 이전의 SQL Server 버전에 대한 연결에 대해 쿼리 알림 속성이 설정되면 발생합니다. 이 경우 상태 값은 .입니다 DBPROPSTATUS_NOTSUPPORTED
.
구독을 시작한다고 해서 향후 메시지가 성공적으로 배달된다는 보장은 없습니다. 또한 지정된 서비스 이름의 유효성이 검사되지 않습니다.
참고 항목
문을 준비하면 구독이 시작되지 않습니다. 문 실행만 시작됩니다. OLE DB 핵심 서비스를 사용하는 경우 쿼리 알림이 영향을 받지 않습니다.
속성 집합에 DBPROPSET_SQLSERVERROWSET
대한 자세한 내용은 행 집합 속성 및 동작을 참조 하세요.