Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否将其他数据与查询一起发送到SQL?_Sql_Sql Server_Triggers - Fatal编程技术网

是否将其他数据与查询一起发送到SQL?

是否将其他数据与查询一起发送到SQL?,sql,sql-server,triggers,Sql,Sql Server,Triggers,简化案例: Database table Cars ID (int) Name (varchar) Model (varchar) 在这个表上有一个更新触发器,它会在另一个表中插入类似“ID为的汽车名称已更改”的内容 从后端运行一个简单的查询 UPDATE Cars SET Name='My First Car' WHERE ID = 1 我想完成的是在查询旁边发送一个附加值,这样我就可以更改触发器来执行如下操作:“ID为的汽车的名称已由ID为的用户更改” 我正在使用SQL SERVER 2

简化案例:

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


我的选项是什么?

触发器可用的信息仅限于表中触发器打开的信息或系统一般可用的信息

由于用户不在原始表中,因此通常需要系统可以使用这些数据。有很多这样的数据。例如,您可以使用内置的db_name函数知道您所在数据库的名称

系统可以根据连接属性向您提供一些信息。例如,orignal_login函数将为您提供实际连接到SQL Server的用户的名称

如果您在某个地方有一个用户表,其中包含用户名、UserId,并且如果该表中的用户名与sql server登录的实际登录名匹配,那么您可以使用原始登录的结果加入到该表中,拉出用户名,现在您有了用户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
   

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

触发器可用的信息仅限于表中触发器打开的信息或系统一般可用的信息

由于用户不在原始表中,因此通常需要系统可以使用这些数据。有很多这样的数据。例如,您可以使用内置的db_name函数知道您所在数据库的名称

系统可以根据连接属性向您提供一些信息。例如,orignal_login函数将为您提供实际连接到SQL Server的用户的名称

如果您在某个地方有一个用户表,其中包含用户名、UserId,并且如果该表中的用户名与sql server登录的实际登录名匹配,那么您可以使用原始登录的结果加入到该表中,拉出用户名,现在您有了用户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
   

正如评论中提到的,由于您的应用程序是作为特定于应用程序的帐户连接的,这当然对您没有帮助。在这种情况下,如果使用SQL Server 2016,则可以尝试使用,否则请在调用更新之前使用并存储用户信息


然后,无论哪种方式,在触发器中提取用户信息并将其用于日志信息。

如果使用SQL Server 2016,则在调用更新之前使用并存储用户信息


然后,无论哪种方式,在触发器中提取用户信息并将其用于您的日志信息。

但大多数情况下,应用程序或web应用程序都有自己的数据库登录名,因此无法找到特定用户。同意。无论如何,将服务器登录名存储在单独的表中会有点奇怪,因为如果表中有人没有有效的登录名,或者反之亦然,会发生什么?给定传输凭据,我不需要单独的Id,我只需要记录实际的原始登录值-如果应用程序正在使用应用程序凭据,而不是转发用户凭据,这仍然不起作用。谢谢,但正如Dale指出的,每个用户都没有单独的数据库连接。您认为可以从哪里获得用户Id值?比如触发器的参数之类的?假设这个评论是为我准备的;我的首选方法是从查询中发送ID或任何其他数据。类似于'updatecarssetname='x',其中id=1选项data='123';不过,大多数情况下,应用程序或web应用程序都有自己的数据库登录名,因此不可能找到特定用户。同意。无论如何,将服务器登录名存储在单独的表中会有点奇怪,因为如果表中有人没有有效的登录名,或者反之亦然,会发生什么?给定传输凭据,我不需要单独的Id,我只需要记录实际的原始登录值-如果应用程序正在使用应用程序凭据,而不是转发用户凭据,这仍然不起作用。谢谢,但正如Dale指出的,每个用户都没有单独的数据库连接。您认为可以从哪里获得用户Id值?比如触发器的参数之类的?假设这个评论是为我准备的;我的首选方法是从查询中发送ID或任何其他数据。萨米特
类似“更新汽车集名称='x',其中id=1选项数据='123';现在正在调查这件事。谢谢。我已经做了一些实验,它似乎适合我的需要。只是为了确定;如果我执行此查询exec sp_set_session_上下文'ID','1';UPDATE Cars SET Name=@Name WHERE ID=1会话上下文仅对该会话/线程有效,因此不会影响将正确执行的任何其他查询?session一词对我来说有点不清楚,因为它可能引用当前连接或登录或线程,但它似乎是当前请求,这完美地解决了我的问题。谢谢现在正在调查这件事。谢谢。我已经做了一些实验,它似乎适合我的需要。只是为了确定;如果我执行此查询exec sp_set_session_上下文'ID','1';UPDATE Cars SET Name=@Name WHERE ID=1会话上下文仅对该会话/线程有效,因此不会影响将正确执行的任何其他查询?session一词对我来说有点不清楚,因为它可能引用当前连接或登录或线程,但它似乎是当前请求,这完美地解决了我的问题。谢谢