【问题标题】:sql server execute as permission errors in triggersql server 在触发器中作为权限错误执行
【发布时间】:2010-12-15 03:00:16
【问题描述】:

我有一个触发器,我想在其中发送一封电子邮件以更新表 SalesClosing 中的一行。现在执行触发器的用户 (dbuser) 的权限非常有限。所以我希望触发器作为 dbmailuser 执行。有权发送电子邮件的用户。我测试了 dbmailuser 在以该用户身份登录时可以执行 sp_send_dbmail。但是,当触发器触发时,我收到错误无法执行 sp_send_dbmail。所以我以 dbuser 身份登录 , 运行 EXECUTE AS LOGIN = 'dbmailuser';并且能够执行 sp_send_dbmail。现在为什么我不能在触发器中做到这一点。我用的是sql server 2008,下面是触发器ddl。

alter TRIGGER SalesClosingTrigger ON SalesClosing
WITH EXECUTE AS 'dbmailuser'
for insert, update
AS
BEGIN
  EXEC msdb.dbo.sp_send_dbmail
  --@profile_name = 'Test_Email_Profile',
  @recipients='testemail@test.com',
  @body = 'This is a test for Database Mail.',
  @body_format = 'TEXT',
  @subject = 'Database Mail Test'
END 
GO

【问题讨论】:

    标签: sql-server sql-server-2008 triggers


    【解决方案1】:

    这是由于execute-as-user scoping - 默认情况下,切换到数据库级用户的上下文仅限于该数据库(并且上面的代码在给定数据库之外执行到 msdb),并且仅数据库身份验证器是无效的。有关如何解决/解决方法的多个选项,请参阅上面的链接。

    【讨论】:

    • +1 并不是我每天都能遇到了解 EXECUTE AS 上下文的人!
    【解决方案2】:

    触发器的 EXECUTE AS 与EXECUTE AS USER = '...' 相同,与EXECUTE AS LOGIN = '...' 不同。 chadhoc 已经指出了与 EXECUTE AS 模拟上下文及其约束的链接。基本上,因为触发器的 EXECUTE AS 子句由 dbo 保证,而不是由 sysadmin 保证,所以它仅在数据库上下文中受信任。

    有两种选择:

    1. 一种尺寸适合所有大锤:ALTER DATABASE <yourdb> SET TRUSTWORTHY ON;。这会将数据库标记为受信任,并且执行上下文可以在数据库之外,如果拥有数据库的登录拥有适当的权限。不建议在高度安全的环境中这样做,因为如果没有适当约束,它会打开通往各种特权高度的大门,并且很难适当约束。

    2. 手术精确度选项:代码签名。有关示例,请参阅Call a procedure in another database from an activated procedure。这不适合胆小的人,它涉及几个复杂的步骤:生成证书、签署过程、删除私钥、将证书复制到 msdb、在 msdb 中创建从证书派生的用户、在证书上授予身份验证数据库派生用户,在证书派生用户的 sp_send_mail 上授予 EXECUTE。这些步骤中的任何一个错误都会使整个序列变得无用,因此很容易搞砸,但从安全角度来看,结果是绝对防弹的。

    【讨论】:

    • 莱姆斯,很好的信息。我会记住代码签名。此数据库服务器用于一个应用程序,并且只有一个数据库。我只是不想让主用户直接访问 sp_send_mail。如果有人在数据库中获取太多信息,那么我会更加担心然后发送电子邮件。不过再次感谢!
    【解决方案3】:

    从触发器发送电子邮件是个坏主意。如果电子邮件服务器关闭,您不希望无法更改数据。

    最好将电子邮件的信息发送到另一个表,然后从定期运行的作业中发送电子邮件。每五分钟运行一次。

    还有一个我以前没有使用过的叫做 Service Broker 的东西可以帮助完成这项任务,您可能想看看它。

    【讨论】:

    • 在 SQL 2005 和 sp_send_dbmail 中已经使用了 Service Broker。它将邮件请求放入 msdb 中的队列中,外部进程将其拾取、提交后并将其传递到配置的 SMTP 服务器。
    • 它是一个遗留应用程序,经典的 asp 等。对于不符合任何标准的应用程序,规则必须弯曲/破坏。
    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 2022-06-24
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2011-03-03
    相关资源
    最近更新 更多