生產環境需求:監控特定資料表,新增資料時自動寄信通知管理員。評估四種方案後,採用內建 Database Mail 最穩健簡潔。
| 方案 | 做法 | 優點 | 缺點/風險 |
|---|---|---|---|
| 1. xp_cmdshell 呼叫外部程式 | 啟用 xp_cmdshell,觸發器中執行 .exe 或 .bat | 彈性高,可呼叫任何可執行檔 | 需高權限、安全性風險大、同步阻塞、GUI 程式會卡死 |
| 2. 觸發器傳參數給 .bat | 同方案 1,僅將值寫入批次檔 | 略微結構化 | 同方案 1 缺點 |
| 3. SQL CLR 整合 | 用 Visual Studio 撰寫 Managed Stored Procedure/Trigger | 語言功能完整、效能佳、除錯容易 | 需啟用 CLR、部署較繁瑣、版本相容性需注意 |
| 4. Database Mail(推薦) | 設定 Database Mail 設定檔,觸發器呼叫 sp_send_dbmail | 純 T-SQL、無外部依賴、安全、非同步、維護簡單 | 需預先設定 SMTP、郵件伺服器 |
-- 1. 於 SSMS 設定 Database Mail(Management → Database Mail)
-- 建立 Profile(如 SQLProfile)、設定 SMTP、測試寄信成功。
-- 2. 建立觸發器
CREATE TRIGGER tri_email
ON [dbo].[ImageGalleries]
AFTER INSERT
AS
BEGIN
IF EXISTS (SELECT * FROM inserted)
BEGIN
DECLARE @content NVARCHAR(MAX);
SELECT @content = i.Name + '|' + i.ImagePath FROM inserted i;
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SQLProfile',
@recipients = 'admin@example.com',
@subject = 'SQL Server 觸發器自動通知',
@body = @content;
END
END;
GO
inserted 虛擬表可能包含多筆資料,範例僅示範取第一筆;實務上建議用游標或 FOR XML PATH 組裝完整內容。msdb.dbo.sysmail_faileditems,需定期監控。Database Mail 方案零額外元件、零權限提升、零同步阻塞,是生產環境首選。