2011-08-23 4 views
3

내에서 실행되지 않습니다msdb.dbo.sp_send_dbmail 내가 교착 상태 모니터링을 설정하려면 다음 코드를 사용했습니다 저장 프로 시저

http://weblogs.sqlteam.com/mladenp/archive/2008/07/18/Immediate-deadlock-notifications-without-changing-existing-code.aspx

을하고 그것을 잘 작동합니다. 문제는 msdb.dbo.sp_send_dbmail이 작동하지 않는 것입니다. 내가 수동으로 저장 프로 시저 내에서 잘을 작동하지만에서 , 내 세션에서 실행하면, 다음과 같은 오류가 발생합니다

2011-08-23 16 : 42 : 45.28이 활성화 된 PROC [DBO]를 spid219s [. usp_ProcessNotification] 대기열에서 실행 중 Wayne.dbo.DeadLockNotificationsQueue는 다음을 출력합니다. 'DeadLockNotificationsQueue 대기열에서 Service Broker 메시지를 수신하는 중 오류가 발생했습니다. 데이터베이스 이름 : Wayne; 오류 번호 : 229; 오류 메시지 : 개체 'sp_send_dbmail', 데이터베이스 'msdb', 스키마 'dbo'에서 EXECUTE 권한이 거부되었습니다. ' 'DatabaseMailUserRole' , @ 회원 이름 = ''

EXEC의 msdb.dbo.sp_addrolemember의 @rolename =;

은 또한 다음을 실행

회원 이름으로 로그온 할 때 도움이되지 않았습니다.

이 문제를 해결하려면 무엇을해야합니까?

감사합니다.

웨인.

+1

활성화 절차가 실행중인 계정과 관련이 있습니다. 그것은 올바른 역할을해야합니다. 이 기사 참조 http://rusanu.com/2006/01/12/why-does-feature-not-work-under-activation/ –

답변

5

Martin이 올바른 원인을 가리키면 활성화 된 프로 시저가 실행되는 EXECUTE AS 컨텍스트입니다. Call a procedure in another database from an activated procedure과 같이 코드 서명을 사용하여 필요한 사용 권한을 부여 할 수 있습니다.

ALTER DATABASE [Wayne] SET TRUSTWORTHY ON; 

전자의 방법은 복잡하지만 안전한 환경에서 필수입니다 : 아니면 데이터베이스 Waynetrustworthy 표시를 간단하게 할 수 있습니다. 나중의 방법은 훨씬 쉽지만, 데이터베이스의 dbo가 자신을 sysadmin 권한으로 에스컬레이션 할 수 있음을 의미합니다. 보안 문제가 우려가없는 경우에는 간단한 TRUSTWORTHY 방법을 사용할 수 있습니다,

+0

신뢰할 수있는 옵션을 사용하십시오. 신뢰할 수있는 옵션은 "나는이 데이터베이스에서 모든 현재 * 및 미래 * 코드를 신뢰합니다"라고 말하는 것과 같습니다. 좋지 않은 곳. 게다가, sproc에 서명하는 절차와 그 모든 것이 복잡하지 않습니다. –

1

당신은 sp_send_dbmail을 호출 MSDB에서 프로 시저를 만들 수 있습니다, 다음, 호출 프로 시저에 대중에게 실행을 부여 GBN에 의해 ​​제안 :. How to execute sp_send_dbmail while limiting permissions합니다. 프로 시저를 실행하기 위해 msdb에 사용자를 추가 할 필요는 없습니다. 분명히 이것은 누구나 절차 적 논리에 따라 메일을 보낼 수있게합니다.