如何在sql中向触发器传递外部参数?
是否可以编写接受外部参数的触发器 在存储历史数据时,我想存储执行更新操作的应用程序用户名。我本想使用User_Name,但后来知道,它只返回数据库用户,而不是应用程序用户 因此,我正在寻找一些关于使用外部参数创建触发器的建议,以便将应用程序用户的id传递给该触发器。我想我已经清楚地解释了我的需求。提前谢谢 这是我的代码,我已经试过了如何在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
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应用程序。不是每个案子都是这样的,我已经做到了。工作完美。必须编写将近一半的代码。大或小是无关紧要的。事实上,应用程序越大,好处就越多。