【问题标题】:Giving a database level trigger full access to a different database table [T-SQL]授予数据库级触发器对不同数据库表的完全访问权限 [T-SQL]
【发布时间】:2012-09-13 10:44:40
【问题描述】:

我正在尝试在任意数据库中设置一个触发器,该触发器将在执行时将信息存储在特定数据库中。但是,我发现如果触发器是由没有显式访问该数据库的人触发的,则触发器执行将失败。

我希望通过以下方式解决这个问题:

CREATE TRIGGER [myTrigger] 
on database
with execute as 'UserWithPermissions'

但这似乎也不起作用......有谁知道这是否可能?任何指针将不胜感激。谢谢。

【问题讨论】:

  • 让任何触发器访问它自己的数据库之外的any 资源通常是一个 的想法。数据库是 SQL Server 中恢复/可用性的单位 - 您真的希望第二个数据库(在任何时候)不可用以防止原始事务提交吗?通常最好使用一些东西(队列表和代理作业,或服务代理)将外部活动与原始事务分离。

标签: sql-server tsql triggers ddl


【解决方案1】:

在 MSSQL 管理中转到 DB-name => Security => Users 并确保用户具有访问权限。此外,Windows 网络身份验证在从其他机器运行 procs 时有很大帮助

-- 编辑--

我认为你想要的叫做“EXECUTE AS”。

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'SqlUser1'
AS
SELECT user_name(); -- Shows execution context is set to SqlUser1.
EXECUTE AS CALLER;
SELECT user_name(); -- Shows execution context is set to SqlUser2, the caller of the    module.
REVERT;
SELECT user_name(); -- Shows execution context is set to SqlUser1.
GO

【讨论】:

  • 您能详细说明一下吗?我确实在我的帖子中引用了 Execute As,但它似乎不起作用。
  • 在 MSSQL 管理中转到 DB-name => 安全 => 用户并确保用户具有访问权限。此外,在从其他机器运行 procs 时,Windows 网络身份验证也有很大帮助。
  • 这就是问题所在...每次我在数据库上创建此触发器时,我是否必须确保创建的用户有权访问触发器将插入的用户?理想情况下,我总是希望触发器能够访问其目标,而无需操纵用户这样做。
  • 您可以通过组、用户、网络甚至机器名称设置权限,我相信有一些许可证。我建议设置 Window 网络身份验证,然后只允许来自 10.*.*.* 范围的连接(a 类 10.* ip 永远无法在互联网上路由)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2014-03-13
  • 2014-08-16
相关资源
最近更新 更多