3

次のコードを使用して、デッドロックの監視を設定しました。

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.28spid219sキューWayne.dbo.DeadLockNotificationsQueueで実行されているアクティブ化されたproc[dbo]。[usp_ProcessNotification]は、次のように出力します。データベース名:ウェイン; エラー番号:229; エラーメッセージ:オブジェクト'sp_send_dbmail'、データベース'msdb'、スキーマ'dbo'に対するEXECUTE権限が拒否されました。

私も以下を実行しました:

EXEC msdb.dbo.sp_addrolemember @rolename ='DatabaseMailUserRole'、@ membername ='';

メンバー名としてログオンしましたが、役に立たなかったようです。

これを修正するには何をする必要がありますか?

ありがとう。

ウェイン。

4

2 に答える 2

5

Martinは、アクティブ化されたプロシージャが実行されるEXECUTEASコンテキストという正しい原因を指摘しました。「アクティブ化されたプロシージャから別のデータベースのプロシージャを呼び出す」に示すように、コード署名を使用して必要な権限を付与できます。または、データベースをWayne 信頼できるものとしてマークすることもできます。

ALTER DATABASE [Wayne] SET TRUSTWORTHY ON;

前者の方法は複雑ですが、安全な環境では必須です。Wayne後者の方法の方がはるかに簡単ですが、データベースのdboが自分自身をsysadmin特権にエスカレートできることを意味します。セキュリティの問題が問題にならない場合は、より単純なTRUSTWORTHYアプローチを使用できます。

于 2011-08-24T00:34:38.243 に答える
1

msdbで、sp_send_dbmailを呼び出すプロシージャを作成し、gbn:アクセス許可を制限しながらsp_send_dbmailを実行する方法で提案されているように、呼び出し元のプロシージャでパブリックに実行を許可できます。プロシージャを実行するためにmsdbにユーザーを追加する必要はありません。明らかに、これにより、手続き型ロジックに従って、誰でもメールを送信できます。

于 2012-12-01T04:29:29.607 に答える