1

是否可以从 sql server 触发器中使用 powershell“Send-MailMessage -SMTPServer”命令?

当数据库中的行更新或创建新行时,我正在尝试发送电子邮件。由于安全限制,我无法使用数据库邮件。但是,我可以通过 powershell 的 Send-MailMessage 命令发送电子邮件。

4

1 回答 1

7

首先,这几乎可以肯定是一个非常糟糕的主意。请记住,触发器可能会导致事务升级方面的意外问题,并且在处理过程中持有锁的时间超过必要的时间。还要记住,人们可能不会期望您的表上有此类触发器,并且他们会尝试对其进行 CRUD 操作,就像它是一个正常的表一样,并且不明白他们的应用程序为什么会超时。

也就是说,您至少可以通过三种方式做到这一点:

  1. 启用xp_cmdshell,并使用它来向 PowerShell 输出,如此处所述:Running Powershell scripts through SQL - 但不要这样做,因为这xp_cmdshell是一种安全风险,这很可能会以一种或另一种方式给您带来问题(无论是因为有人以破坏性的方式使用它,或者因为 PowerShell 失败了而你甚至不知道为什么)。 如果你因为安全限制不能使用数据库邮件,那你绝对不应该使用xp_cmdshell,它有更多的安全问题!
  2. 不要使用 PowerShell,而是配置数据库邮件让您的触发器调用sp_db_sendmail- 但不要这样做,因为这很容易失败或导致更新出现问题(例如 SMTP 服务器关闭并且您的表无法再更新)。(我写了这部分之前我看到你因为安全限制不能使用它。
  3. 想到另一种选择可能更安全,但仍然不理想 - 创建一个实际使用 .NET 发送邮件的 SQL CLR 库SmptClient。这可以加载到您的实例中,并作为可以从触发器调用的常规 SQL 函数公开。这可以比仅启用更安全xp_cmdshell,但如果您没有配置数据库邮件的能力,这可能违反了相同的策略。

而不是这些选项,我会推荐这样的东西:

  1. 不要在每次有更新时发送电子邮件,而是让触发器写入表(或者可能写入 Service Broker 队列);创建一个作业以定期发送包含该表中最新数据的电子邮件,或创建某种报告。这将是更可取的,因为写入表或 SSB 队列应该比尝试从触发器中发送电子邮件更快且更不容易出错。
  2. 配置和使用变更数据捕获。您甚至可以编写一些代理工作或其他内容,以便在有更新时定期向用户发送电子邮件。如果您的版本支持这一点,它可能对您来说更强大和可配置,并且更容易解决触发器可能导致的一些问题。
于 2017-03-07T20:44:01.157 回答