【问题标题】:How to pass external parameters to triggers in sql?如何将外部参数传递给sql中的触发器?
【发布时间】:2013-11-07 09:20:12
【问题描述】:

是否可以编写一个接受外部参数的触发器?

在存储历史数据时,我想存储完成更新操作的应用程序用户名。我想使用User_Name() 但后来知道,它只返回数据库用户,而不是应用程序用户。

因此,我正在寻找一些有关使用外部参数创建触发器的建议,以便我可以将应用程序用户的 id 传递给此触发器。认为我已经清楚地解释了我的需求。提前致谢!

这是我尝试过的代码......

ALTER TRIGGER [dbo].[Audit]
ON [dbo].[MIS_Opus] FOR UPDATE  
AS  
BEGIN  
SET NOCOUNT ON;  
DECLARE @d DATETIME = GETDATE(), @u SYSNAME = SUSER_SNAME();  
Insert into dbo.MIS_OpusAuditTrigger  
(  
OpusId, Category, ProcessName, DOP, RampupCode, _Count, TimeTaken, Remarks, Audit_Action,    Audit_Timestamp, Changed_By  
)  
SELECT   
       OpusId,  
       Category,  
       ProcessName,  
       DOP,   
       RampupCode,   
       _Count,   
       TimeTaken,  
       Remarks,  
       'before update',  
       @d,  
       @u  
    FROM deleted -- <--- ****** deleted ******   
  UNION ALL   
  SELECT   
      OpusId,  
       Category,   
       ProcessName,   
       DOP,  
       RampupCode,  
       _Count,   
       TimeTaken,   
       Remarks,   
       'After update',   
       @d,   
       @u   
    FROM inserted;  
END  

在上面的代码中,只存储了数据库用户ID,我需要存储执行更新操作的用户ID。我正在使用 MSSQL server 2012 请告诉我该怎么做...

【问题讨论】:

  • 我假设这是关于 MSSQL 的。您应该将适当的版本添加到问题的标签中。
  • 应用用户是如何定义的? 应用程序用户和数据库用户之间是否有任何映射?
  • @geomagas 我正在使用 MSSQL 服务器 2012
  • @geomagas 我不明白你的问题。映射的意思,我需要一些例子
  • @geomagas 在 Changed_By 列中,我需要更新表格的用户 ID。

标签: sql sql-server sql-server-2012


【解决方案1】:

您需要为 Changed_By 用户更新主表中的列。在这种情况下,您可以轻松地将其放入审计表中。没有其他方法可以做到这一点,因为通常 Web 应用程序使用一个 SQL Server 用户来处理数据库。

另一种选择是为每个 Web 应用程序用户设置 SQL 用户 - 但在我看来这太疯狂了。

【讨论】:

  • 那是疯了吗?这是唯一合理的方法,如果您可以访问 db security“通常 Web 应用程序使用一个 SQL Server 用户来处理数据库”,因为他们在共享主机上!这是一种权衡,不是功能,也不是某种“最佳实践”!!!
  • 我不完全同意你的看法。如果我们谈论使用 Windows 安全性的企业应用程序,是的。但是,如果您有数十万用户访问的互联网应用程序-在这种情况下,我认为这不是方式。这也不是妥协 - 有些应用程序角色和用户只能在 Web 应用程序中使用。
  • “使用 Windows 安全性”我假设您的意思是 SSPI。这有什么区别? “内部应用程序”不能使用 SSPI 吗?无论哪种方式,安全收益都是巨大的。而且这是一种折衷,因为您的共享主机通常不允许您篡改数据库安全性(用户、权限等)。如果他们这样做了,那么没有人需要重新发明轮子并维护一个自定义的users 表,也不需要散列密码,也不需要在应用程序级别重新实现 ACL,也不会......也不会...... 没有人!
  • 是的,Windows 安全是指 SSPI。我同意重新发明轮子没有意义,但我仍然认为 SSPI 不适用于大型 Web 应用程序。并非适用于所有情况。
  • 好吧,我做到了。完美运行。不得不编写将近 一半的代码。大或小无关紧要。事实上,应用程序越大,好处就越多。
【解决方案2】:

您可以使用 context_info 变量从应用程序传递应用程序用户信息并在触发器中使用它。

【讨论】:

    【解决方案3】:

    也许这会有所帮助。您可以包括“应用程序名称=MyAppName;”在连接字符串中。之后,也可以通过以下命令在 SQL 批处理或 SPROC 中使用该值:

    SELECT APP_NAME();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      相关资源
      最近更新 更多