如何在sql中向触发器传递外部参数?

如何在sql中向触发器传递外部参数?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,是否可以编写接受外部参数的触发器 在存储历史数据时,我想存储执行更新操作的应用程序用户名。我本想使用User_Name,但后来知道,它只返回数据库用户,而不是应用程序用户 因此,我正在寻找一些关于使用外部参数创建触发器的建议,以便将应用程序用户的id传递给该触发器。我想我已经清楚地解释了我的需求。提前谢谢 这是我的代码,我已经试过了 ALTER TRIGGER [dbo].[Audit] ON [dbo].[MIS_Opus] FOR UPDATE AS BEGIN SET NOCO

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

在存储历史数据时,我想存储执行更新操作的应用程序用户名。我本想使用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,请告诉我如何操作…

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


另一种选择是为每个web应用程序用户使用SQL user,但我认为这太疯狂了。

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

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

SELECT APP_NAME();

我假设这是关于MSSQL的。您应该将适当的版本添加到问题的标记中。应用程序用户是如何定义的?应用程序用户和数据库用户之间有映射吗?@geomagas我正在使用MSSQL服务器2012@geomagas我听不懂你的问题。映射意味着,我需要一些example@geomagas在Changed_By列中,我需要更新表的用户id。这太疯狂了?如果您可以访问数据库安全性,那么这是唯一合理的方法!通常web应用程序使用一个SQL Server用户来处理数据库,因为他们在共享主机上!这是一种折衷,不是功能,也不是最佳实践!!!我不完全同意你的看法。如果我们谈论使用Windows安全性的企业应用程序,是的。但如果你有一个互联网应用程序,它可以被数十万用户访问——在这种情况下,我不认为这是一种方式。此外,它也不会妥协-存在只能从web应用程序使用的应用程序角色和用户。这有什么区别?Interner应用程序不能使用SSPI吗?无论哪种方式,安全效益都是巨大的。这是一种折衷,因为您的共享主机通常不允许您篡改DB安全用户、权限等。如果他们这样做了,就没有人需要重新发明轮子并维护自定义用户表,也不需要散列密码,也不需要在应用程序级别重新实现ACL,也不需要。。。也没有没有人!是的,我所说的Windows安全性是指SSPI。我同意重新发明轮子是没有意义的,但我仍然认为SSPI不适用于大型web应用程序。不是每个案子都是这样的,我已经做到了。工作完美。必须编写将近一半的代码。大或小是无关紧要的。事实上,应用程序越大,好处就越多。