将其他数据与查询一起发送到sql?

2nc8po8w  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(232)

简化案例:

Database table Cars
ID (int)
Name (varchar)
Model (varchar)

在这个表上有一个更新触发器,它会将类似“id为的汽车名称已更改”的内容插入到另一个表中
从后端运行一个简单的查询

UPDATE Cars SET Name='My First Car' WHERE ID = 1

我想完成的是在查询旁边发送一个附加值,这样我就可以更改触发器,执行如下操作:“id为的汽车名称已被id为的用户更改”
我正在使用sql server 2017(v14)
我有什么选择?

uz75evzq

uz75evzq1#

如果使用sql server 2016,请使用 SESSION_CONTEXT 否则使用 CONTEXT_INFO 并在调用更新之前存储用户信息。
然后,无论哪种方式,在触发器中提取用户信息并将其用于日志信息。

fruv7luv

fruv7luv2#

触发器可用的信息仅限于表中触发器所在的信息,或系统通常可用的信息。
由于用户不在原始表中,因此通常需要数据对系统可用。像这样的数据相当多。例如,您可以使用内置的 db_name() 功能。
系统可以根据连接属性提供一些信息。例如 orignal_login() 函数将为您提供实际连接到sql server的用户的名称。
如果你有一张table Users 在某个地方,比如说, (UserName, UserId) ,如果该表中的用户名与sql server登录的实际登录名匹配,则可以使用 original_login() 要加入该表,请拉出用户名,现在您有了用户id:

create trigger t on cars after update as begin
   set nocount on;

   insert  myloggingtable(Message, EntryDateTime)
   select  concat('car with id ', inserted.id, ' was updated by ', u.UserId), getdate()
   from    inserted i
   join    Users    u on u.UserName = original_login()
end

正如评论中提到的,由于您的应用程序是作为特定于应用程序的帐户连接的,这当然对您没有帮助。在这种情况下,你可以尝试上下文信息

相关问题