簡體   English   中英

從SQL Server觸發器調用Powershell腳本

[英]Calling Powershell script from SQL Server trigger

是否可以從SQL Server觸發器使用Powershell“ Send-MailMessage -SMTPServer”命令?

我試圖在數據庫中的行更新或創建新行時發送電子郵件。 由於安全限制,我無法使用數據庫郵件。 但是,我可以通過powershell的Send-MailMessage命令發送電子郵件。

首先,這幾乎肯定是一個非常糟糕的主意 請記住,就事務升級而言,觸發器可能導致意外的問題,並且在處理過程中持有鎖定的時間比必要的時間長。 還請記住,人們可能不會期望在您的表上有此類觸發器,他們會像在普通表上一樣嘗試對它執行CRUD操作,並且不了解他們的應用程序為何超時。

也就是說,您至少可以通過三種方式執行此操作:

  1. 啟用xp_cmdshell ,並使用它將其外殼到PowerShell,如此處所述: 通過SQL運行Powershell腳本 -但不要這樣做,因為xp_cmdshell有安全隱患,並且很可能以一種或另一種方式給您帶來問題(是因為有人以有害的方式使用它,還是因為PowerShell只是失敗而您甚至都不知道為什么)。 如果由於安全限制而無法使用數據庫郵件,則絕對不應該使用xp_cmdshell,它具有更多的安全問題!
  2. 不用使用PowerShell,而是配置數據庫郵件讓您的觸發器調用sp_db_sendmail但不要這樣做,因為這很容易失敗或導致更新問題(例如SMTP服務器關閉並且表無法再更新)。 (在寫這篇文章之前,由於安全限制,我看不到它不能使用。
  3. 我想到一個可能更安全但又不理想的選擇-創建一個SQL CLR庫,該庫實際上使用.NET SmptClient發送郵件。 可以將其加載到實例中,並作為常規SQL函數公開,可以從觸發器中調用它。 與僅啟用xp_cmdshell ,這樣做可以更安全地進行,但是,如果您無法配置數據庫郵件,則可能違反了同一策略。

除了這些選項,我建議使用類似以下的方法:

  1. 不必將每次更新都發送電子郵件,而是將觸發器寫入表(或可能寫入Service Broker隊列)中; 創建作業以定期發送包含該表中的最新數據的電子郵件,或者根據該報告創建某種報告。 這將是可取的,因為與嘗試從觸發器中發送電子郵件相比,寫入表或SSB隊列應該更快並且更不容易出錯。
  2. 配置和使用更改數據捕獲 您甚至可以編寫一些代理工作,或在有更新時定期向用戶發送電子郵件。 如果您的版本支持此功能,則它可能對您來說更強大,更可配置,並且可以解決一些觸發器可能引起的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM