如何将外部参数传递给sql中的触发器?

时间:2013-11-07 09:20:12

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

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

在存储历史数据时,我想存储已完成更新操作的应用程序用户名。我想使用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服务器2012请告诉我该怎么做...

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

也许这会有所帮助。您可以包含“Application Name = MyAppName;”在连接字符串中。之后,还可以使用以下命令在SQL批处理或SPROC中使用该值:

SELECT APP_NAME();