特定の列が更新されたときに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