当前位置:  开发笔记 > 编程语言 > 正文

sql server在触发器中执行权限错误

如何解决《sqlserver在触发器中执行权限错误》经验,为你挑选了2个好方法。

我有一个触发器,我想发送一个关于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

boydc7.. 16

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



1> boydc7..:

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



2> Remus Rusanu..:

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

有两种选择:

    一个尺寸适合所有大锤:ALTER DATABASE SET TRUSTWORTHY ON;.如果拥有数据库的loggin具有propper权限,这将提升数据库标记为可信,并且执行上下文可以在数据库之外.这不建议在高度安全的环境中使用,因为如果没有适当的约束,它会打开通向各种高度的门的门,并且很难适当地约束.

    手术切除选项:代码签名.有关示例,请参阅从激活的过程调用另一个数据库中的过程.这不适合胆小的人,它涉及几个复杂的步骤:生成证书,签署过程,删除私钥,将证书复制到msdb,创建从msdb中的证书派生的用户,在证书上授予认证数据库派生用户,在证书派生用户的sp_send_mail上执行grante EXECUTE.任何这些步骤中的任何错误都会导致整个序列无用,因此非常容易搞砸,但从安全角度来看,结果是绝对的防弹.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有