쿼리 알림 작업
적용 대상: SQL Server Azure SQL Managed Instance
Important
SNAC(SQL Server Native Client)는 다음과 함께 제공되지 않습니다.
- SQL Server 2022(16.x) 이상 버전
- SQL Server Management Studio 19 이상 버전
SQLNCLI 또는 SQLNCLI11(SQL Server Native Client) 및 레거시 Microsoft OLE DB Provider for SQL Server(SQLOLEDB)는 새 애플리케이션 개발에 권장되지 않습니다.
새 프로젝트의 경우 다음 드라이버 중 하나를 사용합니다.
SQL Server 데이터베이스 엔진(버전 2012부터 2019까지)의 구성 요소로 제공되는 SQLNCLI의 경우 이 수명 주기 예외 지원을 참조하세요.
쿼리 알림은 SQL Server 2005(9.x) 및 SQL Server Native Client에서 도입되었습니다. SQL Server 2005(9.x)에 도입된 Service Broker 인프라를 기반으로 하는 쿼리 알림을 사용하면 데이터가 변경될 때 애플리케이션에 알림을 받을 수 있습니다. 이 기능은 웹 애플리케이션 같이 데이터베이스의 정보 캐시를 제공하고 원본 데이터가 변경되면 알림을 받아야 하는 애플리케이션에 매우 유용합니다.
쿼리 알림을 사용하면 쿼리의 기본 데이터가 변경될 때 지정된 시간 제한 기간 내에 알림을 요청할 수 있습니다. 알림 요청은 서비스 이름, 메시지 텍스트 및 제한 시간 값을 비롯한 알림 옵션을 서버에 지정합니다. 알림은 애플리케이션이 사용 가능한 알림을 폴링할 수 있는 Service Broker 큐를 통해 전달됩니다.
쿼리 알림 옵션 문자열의 구문은 다음과 같습니다.
service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]
예시:
service=mySSBService;local database=mydb
애플리케이션에서 알림 구독을 만든 다음 종료할 수 있으므로 알림 구독의 수명은 이러한 알림 구독을 시작하는 프로세스보다 깁니다. 구독은 유효한 상태로 유지되며, 구독을 만들 때 지정된 제한 시간 내에 데이터가 변경되면 알림이 발생합니다. 알림은 실행된 쿼리, 알림 옵션 및 메시지 텍스트로 식별되며 제한 시간 값을 0으로 설정하여 취소할 수 있습니다.
알림은 한 번만 전송됩니다. 데이터 변경을 연속해서 알리려면 각 알림이 처리된 후 쿼리를 다시 실행하여 새 구독을 만들어야 합니다.
SQL Server Native Client 애플리케이션은 일반적으로 Transact-SQL RECEIVE 명령을 사용하여 알림 옵션에 지정된 서비스와 연결된 큐에서 알림을 읽어 알림을 받습니다.
참고 항목
예를 들어 dbo.myTable
알림이 필요한 쿼리에서 테이블 이름을 정규화해야 합니다. 두 부분으로 구성된 이름을 사용하여 테이블 이름을 정규화해야 합니다. 3부 또는 4부로 구성된 이름을 사용하면 구독이 유효하지 않습니다.
알림 인프라는 SQL Server 2005(9.x)에 도입된 큐 기능을 기반으로 합니다. 일반적으로 서버에서 생성된 알림은 이러한 큐를 통해 전송되어 나중에 처리됩니다.
쿼리 알림을 사용하려면 큐와 서비스가 서버에 있어야 합니다. 다음과 유사한 Transact-SQL을 사용하여 만들 수 있습니다.
CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])
참고 항목
서비스는 위에 표시된 대로 미리 정의된 계약을 http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification
사용해야 합니다.
SQL Server Native Client OLE DB 공급자
SQL Server Native Client OLE DB 공급자는 행 집합 수정에 대한 소비자 알림을 지원합니다. 소비자는 행 집합 수정의 모든 단계 및 시도된 변경에 대한 알림을 받습니다.
참고 항목
ICommand::Execute를 사용하여 서버에 알림 쿼리를 전달하는 것은 SQL Server Native Client OLE DB 공급자를 사용하여 쿼리 알림을 구독하는 유일한 유효한 방법입니다.
DBPROPSET_SQLSERVERROWSET 속성 집합
OLE DB를 통해 쿼리 알림을 지원하기 위해 SQL Server Native Client는 DBPROPSET_SQLSERVERROWSET 속성 집합에 다음과 같은 새 속성을 추가합니다.
속성 | 형식 | 설명 |
---|---|---|
SSPROP_QP_NOTIFICATION_TIMEOUT | VT_UI4 | 쿼리 알림이 활성 상태로 유지되는 시간(초)입니다. 기본값은 432000초(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
이 문은 큐가 비어 있으면 즉시 빈 결과 집합을 반환합니다. 그렇지 않으면 모든 큐 알림을 반환합니다.
SSPROP_QP_NOTIFICATION_MSGTEXT 및 SSPROP_QP_NOTIFICATION_OPTIONS NULL이 아니고 비어 있지 않은 경우 위에 정의된 세 가지 속성이 포함된 쿼리 알림 TDS 헤더가 명령의 각 실행과 함께 서버로 전송됩니다. 둘 중 하나가 null이거나 비어 있으면 헤더가 전송되지 않고 DB_E_ERRORSOCCURRED 발생합니다(또는 속성이 모두 선택 사항으로 표시된 경우 DB_S_ERRORSOCCURRED). 상태 값은 DBPROPSTATUS_BADVALUE 설정됩니다. 유효성 검사는 실행/준비 시 수행됩니다. 마찬가지로 SQL Server 2005(9.x) 이전의 SQL Server 버전에 대한 연결에 대해 쿼리 알림 속성이 설정되면 DB_S_ERRORSOCCURED 발생합니다. 이 경우 상태 값은 DBPROPSTATUS_NOTSUPPORTED.
구독을 시작한다고 해서 후속 메시지가 성공적으로 배달된다는 보장은 없습니다. 또한 지정된 서비스 이름의 유효성을 확인하지 않습니다.
참고 항목
문을 준비하면 구독이 시작되지 않습니다. 문만 실행하면 이 작업을 수행할 수 있으며 쿼리 알림은 OLE DB 핵심 서비스 사용의 영향을 받지 않습니다.
DBPROPSET_SQLSERVERROWSET 속성 집합에 대한 자세한 내용은 행 집합 속성 및 동작을 참조 하세요.
SQL Server Native Client ODBC 드라이버
SQL Server Native Client ODBC 드라이버는 SQLGetStmtAttr 및 SQLSetStmtAttr 함수에 세 가지 새 특성을 추가하여 쿼리 알림을 지원합니다.
SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT
SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS
SQL_SOPT_SS_QUERYNOTIFICATION_TIMEOUT
SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT 및 SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS NULL이 아닌 경우 위에서 정의한 세 가지 특성을 포함하는 쿼리 알림 TDS 헤더는 명령이 실행될 때마다 서버로 전송됩니다. 둘 중 하나가 null이면 헤더가 전송되지 않고 SQL_SUCCESS_WITH_INFO 반환됩니다. 유효성 검사는 SQLPrepare 함수, SqlExecDirect 및 SqlExecute에서 수행되며, 특성이 유효하지 않으면 모두 실패합니다. 마찬가지로 SQL Server 2005(9.x) 이전의 SQL Server 버전에 대해 이러한 쿼리 알림 특성이 설정되면 SQL_SUCCESS_WITH_INFO 실행이 실패합니다.
참고 항목
준비 문은 구독을 시작하지 않습니다. 문 실행을 통해 구독을 시작할 수 있습니다.
특수 사례 및 제한 사항
알림에는 다음 데이터 형식이 지원되지 않습니다.
text
ntext
image
이러한 형식을 반환하는 쿼리에 대한 알림 요청이 이루어지면 알림이 즉시 실행되어 알림 구독을 사용할 수 없음을 지정합니다.
일괄 처리 또는 저장 프로시저에 대한 구독 요청이 이루어지면 일괄 처리 또는 저장 프로시저 내에서 실행되는 각 문에 대해 별도의 구독 요청이 이루어집니다. EXECUTE 문은 알림을 등록하지 않지만 실행된 명령에 알림 요청을 보냅니다. 일괄 처리인 경우 컨텍스트가 실행된 문에 적용되고 위에서 설명한 것과 같은 규칙이 적용됩니다.
동일한 데이터베이스 컨텍스트에서 동일한 사용자가 제출하고 동일한 템플릿, 동일한 매개 변수 값, 동일한 알림 ID 및 기존 활성 구독의 동일한 배달 위치를 가진 알림에 대한 쿼리를 제출하면 기존 구독이 갱신되어 지정된 새 제한 시간이 다시 설정됩니다. 즉, 동일한 쿼리에 대한 알림이 요청되면 하나의 알림만 전송됩니다. 일괄 처리에서 중복된 쿼리 또는 여러 번 호출된 저장 프로시저의 쿼리에 적용됩니다.