SQL Server触发器,如何传值?

时间:2022-06-23 05:11:39
我想写一个触发器,如果C1表中发生INSERT,则在B3表加一条记载表变动的记录。

B3表的date字段记录:C1表发生INSERT的日期。
B3表的name字段记录:是谁在C1表中执行了INSERT操作。

我知道date可以等于getdate(),
但name需要程序客户端将“操作人的姓名”传值进来,触发器如何接收程序客户端的传值呢?

10 个解决方案

#1


触发器是不能传值的,我觉得你可以你在c1表插入的时候就插入用户名不行吗,
这样触发器就能得到用户名了

#2


微软的标准做法,登录触发器,登录的时候给每个用户建一个临时表,并且在表里赋值当前用户是谁,触发器里从这个临时表里查当前用户
http://msdn.microsoft.com/zh-cn/library/bb326598.aspx

#3


如果不是你自己系统中设定的用户,可以这样取他的机器名用户等

SELECT 
       LOGINAME,   --连接的时候使用的哪个SQL登陆用户         
       HOSTNAME,    --客户端的机器名                           
       NT_USERNAME, --客户端的登陆用户)   
       pROGRAM_NAME  --是从查询分析器,还是应用程序来执行的                 
  FROM MASTER..SYSPROCESSES
  WHERE SPID=@@SPID


#4


愚见。。
1.在C1中增加一个"操作人"字段..那么利用触发器就可以从inserted表中得到"操作人"了;
2.用存储过程,把C1和B3的insert写在一个存储过程里,存储过程加个“@操作人”的参数,
 在程序中调用这个存储过程时用操作人传入去就可以..

#5


SYSPROCESSES  这里可以获得LZ想要的

#6


引用 4 楼 liang145 的回复:
愚见。。
1.在C1中增加一个"操作人"字段..那么利用触发器就可以从inserted表中得到"操作人"了;
2.用存储过程,把C1和B3的insert写在一个存储过程里,存储过程加个“@操作人”的参数,
在程序中调用这个存储过程时用操作人传入去就可以..


同意楼上!2中方法均可,我通常用这两种方法,如果字段太多的话我就写触发器,这样前台编码省力,字段少的话就写个存储过程,并套上事务。

#7


我之所以没在C1中增加一个"操作人"字段,是因为不但每次INSERT时要记录,而且以后所有发生的UPDATA也要记下来,所以单独做了一个B3表,专门记录所有的INSERT、UPDATA的操作日期和操作人。

#8


如果每一个用户都在sql sqlserver中有对应的用户,
操作人的姓名可以取:suser_sname()
如果所有的连接都用同一个用户,即所有人的suser_sname()相同,
只能在C1表增加操作人的姓名字段,客户端程序自行维护该字段的值

#9


这本来就不是Sql解决的问题
在程序代码中去处理,这就是一个日志记录的问题

#10


数据库操作日志!

#1


触发器是不能传值的,我觉得你可以你在c1表插入的时候就插入用户名不行吗,
这样触发器就能得到用户名了

#2


微软的标准做法,登录触发器,登录的时候给每个用户建一个临时表,并且在表里赋值当前用户是谁,触发器里从这个临时表里查当前用户
http://msdn.microsoft.com/zh-cn/library/bb326598.aspx

#3


如果不是你自己系统中设定的用户,可以这样取他的机器名用户等

SELECT 
       LOGINAME,   --连接的时候使用的哪个SQL登陆用户         
       HOSTNAME,    --客户端的机器名                           
       NT_USERNAME, --客户端的登陆用户)   
       pROGRAM_NAME  --是从查询分析器,还是应用程序来执行的                 
  FROM MASTER..SYSPROCESSES
  WHERE SPID=@@SPID


#4


愚见。。
1.在C1中增加一个"操作人"字段..那么利用触发器就可以从inserted表中得到"操作人"了;
2.用存储过程,把C1和B3的insert写在一个存储过程里,存储过程加个“@操作人”的参数,
 在程序中调用这个存储过程时用操作人传入去就可以..

#5


SYSPROCESSES  这里可以获得LZ想要的

#6


引用 4 楼 liang145 的回复:
愚见。。
1.在C1中增加一个"操作人"字段..那么利用触发器就可以从inserted表中得到"操作人"了;
2.用存储过程,把C1和B3的insert写在一个存储过程里,存储过程加个“@操作人”的参数,
在程序中调用这个存储过程时用操作人传入去就可以..


同意楼上!2中方法均可,我通常用这两种方法,如果字段太多的话我就写触发器,这样前台编码省力,字段少的话就写个存储过程,并套上事务。

#7


我之所以没在C1中增加一个"操作人"字段,是因为不但每次INSERT时要记录,而且以后所有发生的UPDATA也要记下来,所以单独做了一个B3表,专门记录所有的INSERT、UPDATA的操作日期和操作人。

#8


如果每一个用户都在sql sqlserver中有对应的用户,
操作人的姓名可以取:suser_sname()
如果所有的连接都用同一个用户,即所有人的suser_sname()相同,
只能在C1表增加操作人的姓名字段,客户端程序自行维护该字段的值

#9


这本来就不是Sql解决的问题
在程序代码中去处理,这就是一个日志记录的问题

#10


数据库操作日志!