触发器是一种特殊的存储过程,与存储过程不同的是存储过程通过调用名称来执行,而触发器的调用通过事件触发,自动调用执行。 例如:对表的增删改,如果定义了对应的触发器,载进行增删改时系统会自动调用

    分类: DDL触发器:create,alter,drop DML触发器:insert,update,delete

    • DML触发器又分为
    • after触发器: inter,update,delete操作之后执行
    • instead of触发器,insert,update,delete操作不执行,执行触发器中的内容

    inserted deleted:插入表 删除表 两者都属于逻辑表,也就是虚表,系统在执行存储过程的时候,在内存中创建,只能读取,必能修改,结构与操作的表相同,触发器执行完成之后,这两个表自动删除

    对表的操作 inserted表 deleted表
    insert 存放插入的数据
    update 存放更新后的数据 存放更新前的数据
    delete 存放被删除的数据

    inserted 存放插入或更新后的数据
    deleted 存放更新前或删除的数据
    触发器执行过程中,都是可以访问的,提交之前,可以撤销,类似于事务的回滚
    触发器是一个特殊的事务,在操作数据库表的时候,设置一些条件,如果不满足可以回滚

    1. 1.after insert
    2. create trigger trigger_UserInfos_insert
    3. on UserInfos
    4. for insert --也可以是after insert
    5. as
    6. --T-SQL
    7. declare @id int,@name varchar(50)
    8. select @id =UserId,@name=UserName from inserted
    9. print convert(varchar,@id)+','+@name+"添加成功"
    10. go
    11. --触发trigger_UserInfos_insert
    12. insert into UserInfos(UserName,UserPwd,DeptId,Age)
    13. values('lqq','123',2,23)
    14. 2.after update
    15. create trigger trigger_UserInfos_update
    16. on UserInfos
    17. for update
    18. as
    19. declare @id int,@name varchar(50),@age int
    20. select @id=UserId,@name=UserName,@age=Age from deleted
    21. print '修改前:'+convert(varchar,@id)+','+@name+convert(varchar,@age)
    22. select @id=UserId,@name=UserName,@age=Age from inserted
    23. print '修改后:'+convert(varchar,@id)+','+@name+convert(varchar,@age)
    24. select * into UserInfoBackup from deleted--将更新前的数据备份到新表、
    25. go
    26. --触发trigger_UserInfos_update
    27. update UserInfos set UserName="lqq",Age=21
    28. where UserId =22
    29. 3.after delete
    30. create trigger trigger_UserInfos_delete
    31. on UserInfo
    32. for delete
    33. declare @id int,@name varchar(50),@age int
    34. select @id=UserId,@name=UserName,@age=Age from deleted
    35. print '要删除的数据:'+convert(varchar,@id)+','+@name+convert(varchar,@age)
    36. --备份
    37. if(OBJECT_ID('UserInfoBackup','U') is not null)
    38. --目标表存在
    39. insert into UserInfoBackup select * from deleted
    40. else
    41. --备份表不存在
    42. select * into UserinfoBackup from deleted
    43. print "备份成功"
    44. go
    45. --触发
    46. delete from UserInfos where UserId = 22
    47. --标识列备份表不能用select *
    48. 4.instead of insert
    49. create trigger trigger_UserInfos_insteadof
    50. on UserInfos
    51. instead of insert
    52. as
    53. declare @id int,@name varchar(50),@age int
    54. select @id=UserId,@name=UserName,@age=Age from inserted
    55. print '要添加的数据:'+convert(varchar,@id)+','+@name+convert(varchar,@age)
    56. go
    57. --触发
    58. insert into UserInfos(UserName,UserPwd,Age,DeptId)
    59. values('lqq01','123',23,2)

    after insert:在触发器中,标识列已经自动生成,且有值
    instead of insert:在触发器中,标识列并未生成,没有值(0),触发器执行完毕后,要插入的数据并没有插入(插入语句不执行)