是否可以编写一个接受外部参数的触发器?
在存储历史数据时,我想存储已完成更新操作的应用程序用户名。我想使用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请告诉我该怎么做...
答案 0 :(得分:1)
您需要在主表中为Changed_By用户更新列。在这种情况下,您可以轻松地将其放在审计表中。没有其他方法可以做到这一点,因为通常Web应用程序使用一个SQL Server用户来处理数据库。
另一种选择是为每个Web应用程序用户提供SQL用户 - 但在我看来这是疯了。
答案 1 :(得分:0)
您可以使用context_info变量从应用程序传递应用程序用户信息,并在触发器中使用它。
答案 2 :(得分:0)
也许这会有所帮助。您可以包含“Application Name = MyAppName;”在连接字符串中。之后,还可以使用以下命令在SQL批处理或SPROC中使用该值:
SELECT APP_NAME();