请教触发器的写法

PineJiang 2015-07-23 08:42:31
create trigger tgr_student_log
on dbo.T_student
after insert,update,delete
as
if ((exists (select 1 from inserted)) and (exists (select 1 from deleted)))
begin
insert into log(action) values('updated');
end
else if(exists(select 1 from inserted)and not exists(select 1 from deleted))
begin
insert into log(action) values('inserted');
end
else if (not exists(select 1 from inserted) and exists(select 1 from deleted))
begin
insert into log(action) values('deleted');
end
go

这是我建的一个简单的记录表操作的触发器,我想记录下所插入、修改或删除的内容和操作者该怎么写?
比如,我删除了T_student表中一个学生的信息,我想通过触发器记录下来被删除的这个学生的名字或者学号,以及是谁删除的?
请高手指教谢谢!


...全文
64 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pact_Alice 2015-07-23
  • 打赏
  • 举报
回复
http://blog.csdn.net/haiwer/article/details/3016270 我觉得这个文章应该对你有帮助 CREATE TABLE TBLOG ( ID INT NOT NULL IDENTITY(1, 1), EVTIME DATETIME NOT NULL DEFAULT (Getdate()),--访问时间 SQL VARCHAR(300),--执行的SQL语句 USERID VARCHAR(128) NOT NULL DEFAULT (Suser_sname()),--连接的时候使用的哪个SQL登陆用户 HOSTNAME VARCHAR(128) NOT NULL DEFAULT (Host_name()),--客户端的机器名 LOGINID VARCHAR(128),--客户端的登陆用户(OS的用户) APPNAME VARCHAR(128) NOT NULL DEFAULT(App_name()),--是从查询分析器,还是应用程序来执行的 OPTYPE INT,--执行的是INSERT,UPDATE,还是DELETE操作 ROWCNT INT --影响了多少行数据 ) GO SELECT * FROM TBLOG t --测试表结构 CREATE TABLE TBTEST ( A INT, B VARCHAR(10) ) GO CREATE TRIGGER TR_TBTEST ON TBTEST FOR INSERT, DELETE, UPDATE AS --ROWCNT DECLARE @ROWS INT SET @ROWS=@@ROWCOUNT SET NOCOUNT ON --SQL CREATE TABLE #T ( EVENTTYPE VARCHAR(20), PARAMETERS INT, EVENTINFO VARCHAR(300) ) DECLARE @SPID VARCHAR(20) SET @SPID=Cast(@@SPID AS VARCHAR) INSERT #T EXEC('DBCC INPUTBUFFER ('+@SPID+')') --OPTYPE DECLARE @OPTYPE INT SET @OPTYPE=2 --UPDATE IF NOT EXISTS (SELECT 1 FROM INSERTED) SET @OPTYPE=3 --DELETE IF NOT EXISTS (SELECT 1 FROM DELETED) SET @OPTYPE=1 --INSERT --进程信息 DECLARE @USERID VARCHAR(128),--连接的时候使用的哪个SQL登陆用户 @HOSTNAME VARCHAR(128),--客户端的机器名 @LOGINID VARCHAR(128),--客户端的登陆用户(OS的用户) @APPNAME VARCHAR(128) --是从查询分析器,还是应用程序来执行的 SELECT @USERID = LOGINAME,--连接的时候使用的哪个SQL登陆用户 @HOSTNAME = HOSTNAME,--客户端的机器名 @LOGINID = NT_USERNAME,--客户端的登陆用户(OS的用户) @APPNAME = PROGRAM_NAME --是从查询分析器,还是应用程序来执行的 FROM MASTER..SYSPROCESSES WHERE SPID = @@SPID --INSERT INSERT TBLOG (SQL, USERID, HOSTNAME, LOGINID, APPNAME, OPTYPE, ROWCNT) SELECT EVENTINFO, @USERID, @HOSTNAME, @LOGINID, @APPNAME, @OPTYPE, @ROWS FROM #T GO --测试 --先在企业管理器输入两条记录 --A B --1 1 --2 2 --再执行语句: INSERT TBTEST VALUES(3, '3') GO INSERT TBTEST SELECT A + 3, B + '3' FROM TBTEST GO BEGIN TRANSACTION UPDATE TBTEST SET A = 100, B = '100' WHERE A = 3 COMMIT TRANSACTION GO DELETE TBTEST WHERE A = 4 GO SELECT *FROM TBTEST GO SELECT *FROM TBLOG GO
PineJiang 2015-07-23
  • 打赏
  • 举报
回复
引用 1 楼 Cherise_huang 的回复:

create trigger goodsdelete
on goods
after delete
as
delete from orders
where goodsname in
(select name from deleted) 
希望对你有帮助: http://www.jb51.net/article/23895.htm
引用 2 楼 Landa_Alice 的回复:
一般我们设计数据库表结构的时候都会添加系统字段为:当前登录人登录时间,修改人,修改时间 。每次数据的修改,插入等就会将当前登录人带入到数据库中,方便数据的追踪
引用 2 楼 Landa_Alice 的回复:
一般我们设计数据库表结构的时候都会添加系统字段为:当前登录人登录时间,修改人,修改时间 。每次数据的修改,插入等就会将当前登录人带入到数据库中,方便数据的追踪
我该如何获取这些信息了,我的需求就是想见一个log表记录前台数据的后动情况,比如:在什么时间谁删除了一个订单,或者在什么时间谁修改或增加了一个订单
PineJiang 2015-07-23
  • 打赏
  • 举报
回复
引用 1 楼 Cherise_huang 的回复:

create trigger goodsdelete
on goods
after delete
as
delete from orders
where goodsname in
(select name from deleted) 
希望对你有帮助: http://www.jb51.net/article/23895.htm
能把这个插入到上面那个log表里,然后在log表里显示所删除的内容吗?
Pact_Alice 2015-07-23
  • 打赏
  • 举报
回复
一般我们设计数据库表结构的时候都会添加系统字段为:当前登录人登录时间,修改人,修改时间 。每次数据的修改,插入等就会将当前登录人带入到数据库中,方便数据的追踪
Cherise_huang 2015-07-23
  • 打赏
  • 举报
回复

create trigger goodsdelete
on goods
after delete
as
delete from orders
where goodsname in
(select name from deleted) 
希望对你有帮助: http://www.jb51.net/article/23895.htm

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧