2010-03-17 2 views
1

Service Broker를 사용하여 SQL Server에서 감사를 구성하려고합니다. DDL 이벤트 (큐, 라우트, 엔드 포인트, 이벤트 통지)를 캡처하는 데 필요한 모든 구성을 수행했습니다. DDL 이벤트의 출처에서 클라이언트의 호스트 이름을 가져올 수 없다는 점을 제외하면 올바르게 작동합니다.Service Broker 큐를 읽을 때 호스트 이름 가져 오기 (SQL Server 2005)

서비스 브로커의 활성화 절차를 사용하여 message_body에서 값을 읽으려고했으나 호스트 이름이 포함 된 xml 요소가 없습니다. SPID 값을 볼 수는 있지만 사용할 수는 없습니다. sp_who를 실행하고이 SPID에 대해 sys.processes를 쿼리해도 값이 반환되지 않습니다. 그리고 매개 변수없이 sp_who를 실행하면 프로세스가 하나만 표시됩니다 (서비스 브로커가 사용하는 백그라운드 프로세스라고 생각합니다). 메시지가 비동기 적으로 전송 되었기 때문에 모두입니까? 그런데 왜 활성화 컨텍스트가 sys.processes 뷰에서 다른 데이터를 볼 수 있습니까?

동일한 목표를 달성 할 수있는 DDL 트리거가 있음을 알고 있지만 해당 명령이 실행되는 것과 밀접하게 결합 된 것 같습니다. 따라서 트리거가 실패하면 명령도 실패합니다.

업데이트 : xp_cmdshell과 sqlcmd (명령 줄 앱)의 조합을 사용하여 호스트 이름을 검색 할 수있었습니다. 그러나 메시지가 비동기 적이기 때문에 메시지가 항상 대기열에서 읽히기 전에 DDL 명령을 발행 한 SPID가 이미 연결이 끊어져있을 수도 있습니다.

+0

내 질문을 읽을 때 이벤트 알림 메시지가 다른 SQL 서버에서 온 것일 수 있으므로 호스트 이름을 확인하기 위해 SPID를 사용한다면 그 서버를 사용하여 해결해야합니다. – Darnell

답변

0

여기서는 구현하려는 항목이 확실치 않지만 활성화 된 프로시 저는 DMV의 행 하위 집합 만 볼 것으로 예상됩니다. 이것은 종종 프로 시저를 디버깅 할 때 사용하는 다른 사용자를 가장하는 활성화 컨텍스트와 관련이 있습니다. 가장 된 사용자는 권한이있는 서버 수준보기 및 DMV 행만 볼 수 있습니다. 자세한 내용은 herehere을 참조하십시오.

+0

답장을 보내 주셔서 감사합니다. 달성하고자하는 것은 이벤트 알림 및 Service Broker를 사용하여 DDL 이벤트를 캡처하는 것입니다. 유감스럽게도 서비스 브로커에 전송되는 DDL 이벤트 알림 메시지에는 DDL 명령이 시작된 호스트 이름에 대한 정보 (SPID 만 포함)가 없습니다. 필자는 SP가 디버거 또는 SSMS에서 파손되지 않고 메시지 큐에 의해 활성화 될 때 일부 테이블에 내용을 덤핑하여 DMV를 검사 할 수 있습니다. – Darnell

+0

EVENTDATA의 요소를 사용할 수 없습니까? –

+0

그러나 ServerName은 DDL 명령이 실행되는 데이터베이스 서버의 이름입니다. 실제로 명령을 발행 한 클라이언트의 호스트 이름에 관심이 있습니다. – Darnell

관련 문제