0

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

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

4

3 回答 3

1

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

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

于 2013-11-07T10:04:23.810 回答
0

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

于 2014-06-13T07:57:14.240 回答
0

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

SELECT APP_NAME();
于 2014-06-13T08:50:22.553 回答