2016-05-04 40 views
1

トリガーで電子メールを送信したい。私はmsdb.dbo.sp_send_dbmailを使っています。私はアクセス許可を正しく設定する方法に問題があります。SQLサーバーで電子メールを送信するトリガー

データにアクセスできるデータベースのユーザーにDatabaseMailUserRolemsdbを追加したくありません。

したがって、私は別のユーザーmailerを作成しましたが、これはDatabaseMailUserRoleです。

トリガ定義は次のとおりです。

CREATE TRIGGER MyTrigger 
    ON MyTable 
    WITH EXECUTE AS 'mailer' 
    AFTER INSERT 
AS 
BEGIN 
    exec msdb.dbo.sp_send_dbmail ... 
END 

私は、次のエラーを取得しています:

The EXECUTE permission was denied on the object 'sp_send_dbmail', database 'msdb', schema 'dbo'.

(私はWITH EXECUTE AS 'mailer'を削除し、データベースにアクセスしているユーザーにDatabaseMailUserRoleを追加すると、それが動作

+0

[SQLサーバのトリガで許可エラーとして実行]の可能な複製(http://stackoverflow.com/questions/1709335/sql-server-execute-as-permission-errors-in-trigger) –

答えて

1

でないと、は重い持ち上げや時間がかかることをお勧めします。トリガーで電子メールを送信するなどのタスクをオンにします。

トリガは、トリガを発生させたトランザクションのコンテキストで実行されます。トリガは、トリガとそのすべての操作が完了するまで待たなければなりません。これはあなたのシステムのパフォーマンスを殺すための確実な方法です。

私はかなりお勧めしたいことはこれである:あなたのトリガー内

  • 、ちょうど何かが電子メールを送信するように(実行する必要があることを表に「ノート」を作り、すべての保管SQL Serverエージェントによって実行される別のスタンドアロンタスク(たとえば、スケジュールされたジョブ、SQL Serverエージェントによって実行される)を作成して、 "コマンド"テーブルをチェックする独立したタスクを作成します。電子メールを送信したり、多数の行を更新したり、データをエクスポートしたりするなど、実際に必要なアクションを実行します。そのような構成で

は、あなたのトリガがリーンと軽快 滞在し、絶対に必要なよりもあなたのシステム上でより多くの景気減速を引き起こさないことを確認してください。

+0

電子メールを送信しています重い持ち上げ操作?電子メールはキューに直接送られていないと思った。 重大なエラーが検出された場合にのみ電子メールを送信しています。 –

+0

@TN:SMTPの送信に問題が発生した場合、*電子メールを送信する*時間がかかることがあります。タイムアウトがあり、トランザクションに30秒または60秒を追加するのは良いアイデアではありません。 –

+0

'msdb.dbo.sp_send_dbmail'はSMTPの送信が完了するまで待つと思いますか?私は、電子メールが送信されるまで待っていると思って、 'msdb.dbo.sp_send_dbmail'は電子メールが送信されるまで待っていません。 –

関連する問題