2

特定の列が更新されたときにcursors/を使用して電子メールを送信するトリガーがデータベースにありました。sp_send_dbmailこれはベストプラクティスではないと言われたので、受信者、件名、本文などの列を含む EmailNotify という新しいテーブルを作成しました。代わりに、トリガーは送信したいメールをこのテーブルに挿入します。

このテーブルと電子メールをチェックする数分ごとに実行されるジョブを作成したいと考えています。以下の項目は私が思いついたものですが、この場合カーソルを使用してもよろしいでしょうか?送信した行がわかるように、テーブルに送信済みフィールドを含める必要がありますか? カーソル内で変更できますか?または、後でテーブルを切り捨てることをお勧めしますか?

DECLARE @emailSubject AS NVARCHAR(100);
DECLARE @emailRecipients AS NVARCHAR(100);
DECLARE @emailBody AS NVARCHAR(max);

DECLARE cur CURSOR LOCAL READ_ONLY FAST_FORWARD FOR
    SELECT
        recipients,
        subject,
        body
    FROM 
       EmailNotify;

OPEN cur

FETCH NEXT FROM cur INTO 
    @emailRecipients,
    @emailSubject,
    @emailBody

WHILE @@FETCH_STATUS = 0
BEGIN

        EXEC msdb.dbo.sp_send_dbmail
                @profile_name = 'name',
                @recipients = @emailRecipients,
                @body = @emailBody,
                @body_format = 'HTML',
                @subject =  @emailSubject;

        FETCH NEXT FROM cur INTO 
            @emailRecipients,
            @emailSubject,
            @emailBody
END

CLOSE cur
DEALLOCATE cur
4

1 に答える 1