0

INSERTで簡単なトリガーがあります

ALTER TRIGGER [dbo].[SendErrorEmail]
   ON  [dbo].[tblNewErrorLog]
   FOR INSERT
AS 
BEGIN   


    EXEC msdb.dbo.sp_send_dbmail 
        @profile_name='myprofile',
        @recipients='me@me.com',
        @subject='error in the database',
        @body = 'check it out'

END
  • Management Studioを使用して手動で行を追加すると、すべて問題なく、行が追加された電子メールが送信されます。
  • エラーがサービスを介してログに記録された場合、何もありません。メールも新しい行もありません。
  • トリガーを削除すると、期待どおりに機能し、行が追加されます。
  • トリガーを保持しても、電子メールSPを削除すれば、問題ありません。新しい行が追加されました。

それで、エラーは明らかに電子メールと関係があります、多分セキュリティ?サービスがDBに接続するために使用する資格情報にログインしようとしましたが、手動で行を追加すると機能します。

また、メールが送信されなくても挿入が失敗するのではないかと少し心配ですが、それはなぜですか?

どこからトラブルシューティングを開始するかについての考えは大歓迎です。

ありがとう!

編集:コード一般からtrycatchを削除しましたTidyup

4

1 に答える 1

2

トリガーは、プロシージャに対するEXECUTE権限を持たないコンテキストで実行されていmsdb.dbo.sp_send_dbmailます。EXECUTE AS制約されたサンドボックスに陥っている可能性があります。実行コンテキストについてを参照してください。これは、問題を説明するときに正確に現れます。SSMSからは機能しますが、アプリケーションでは機能しません。

コード署名を使用して、EXECUTE ASコンテキストサンドボックスで実行されているコードに実行権限を付与する方法の例については、アクティブ化されたプロシージャから別のデータベースのプロシージャを呼び出すを参照してください。

コードがEXECUTEAsで実行されていない場合は、権限の単純な問題です。アプリケーションが使用するサービスアカウントに[msdb]アクセスとEXECUTE権限を付与するかsp_send_dbmail、上記のようにコード署名を再度使用することができます。

于 2012-06-11T11:24:14.757 に答える