2017-03-07 1 views
1

Ist es möglich, Powershell "Send-MailMessage -SMTPServer" -Befehl aus dem SQL Server-Trigger zu verwenden?Powershell-Skript von SQL Server-Trigger aufrufen

Ich versuche, E-Mails zu senden, wenn die Zeilen in der Datenbank aktualisiert oder neue Zeile erstellt. Aufgrund von Sicherheitseinschränkungen kann ich keine Datenbank-Mail verwenden. Ich kann jedoch E-Mails über den Powershell-Befehl Send-MailMessage senden.

Antwort

4

Zunächst einmal ist dies fast sicher eine sehr schlechte Idee. Denken Sie daran, dass Auslöser zu unerwarteten Problemen bei der Transaktions-Eskalation führen und Sperren während der Verarbeitung länger als notwendig halten können. Denken Sie auch daran, dass die Leute wahrscheinlich nicht erwarten, dass es solche Trigger auf Ihrem Tisch gibt, und dass sie versuchen werden, CRUD-Operationen darauf auszuführen, als wäre es ein normaler Tisch und nicht zu verstehen, warum ihre Anwendungen auslaufen.

Das heißt, könnten Sie dies mindestens drei Möglichkeiten:

  1. aktivieren xp_cmdshell, und verwenden, die auf Powershell zu berappen, wie hier erklärt: Running Powershell scripts through SQL - aber dies nicht tun, weil xp_cmdshell ist ein Sicherheitsrisiko, und das ist sehr wahrscheinlich, dass es für Sie auf die eine oder andere Weise Probleme verursacht (sei es, weil jemand es schädlich verwendet oder weil PowerShell einfach ausfällt und Sie nicht einmal wissen, warum). Wenn Sie aus Sicherheitsgründen keine Datenbankmail verwenden können, sollten Sie auf keinen Fall xp_cmdshell verwenden, was noch weitere Sicherheitsbedenken aufwirft!
  2. Anstatt die PowerShell zu verwenden, konfigurieren Sie Database Mail haben Sie Ihren Trigger-Aufruf sp_db_sendmail - aber tun Sie dies nicht, weil dies leicht fehlschlagen oder Probleme für Ihre Updates verursachen könnte (zB SMTP-Server geht aus und Ihre Tabelle kann nicht mehr aktualisiert werden) . (Ich schrieb diesen Teil, bevor ich sah, dass Sie es aus Sicherheitsgründen nicht verwenden können.)
  3. Eine andere Option kommt in den Sinn, die sicherer sein kann, aber immer noch nicht ideal - erstellen Sie eine SQL CLR-Bibliothek, die tatsächlich sendet die Mail mit dem .NET SmptClient. Dies könnte in Ihre Instanz geladen werden und als reguläre SQL-Funktion verfügbar gemacht werden, die von Ihrem Auslöser aufgerufen werden könnte. Dies kann sicherer als das Aktivieren xp_cmdshell getan werden, aber wenn Sie Datenbank-E-Mail nicht konfigurieren können, verletzt dies wahrscheinlich die gleiche Richtlinie.

    1. Anstatt das Senden einer E-Mail jedes Mal gibt es ein Update, haben Ihre Trigger Schreiben auf eine Tabelle (oder vielleicht zu einem Service Broker:

    Anstelle dieser Optionen, würde ich so etwas wie diese empfehlen Warteschlange); Erstellen Sie einen Job, um regelmäßig E-Mails mit den neuesten Daten aus dieser Tabelle zu senden, oder erstellen Sie einen Bericht daraus. Dies ist vorzuziehen, da das Schreiben in eine Tabelle oder eine SSB-Warteschlange schneller und weniger fehleranfällig sein sollte als das Senden einer E-Mail in einem Trigger.

  4. Konfigurieren und verwenden Sie Change Data Capture. Sie könnten sogar einige Agent-Jobs schreiben oder etwas, um Benutzer regelmäßig per E-Mail zu benachrichtigen, wenn Updates verfügbar sind. Wenn Ihre Version dies unterstützt, kann es für Sie etwas leistungsfähiger und konfigurierbarer sein und einige Probleme lösen, die Auslöser leichter verursachen können.
+1

Upvoted nach dem Lesen der ersten Zeile. Ich lese jetzt den Rest. –

+0

Danke für die detaillierte Erklärung. –