目录

 

--触发器

--语法:

--例1.

--例二:当删除一条学生记录的时候,把被删除的学生记录备份到stuBak表中

--例三.instead of触发器。当录入学生成绩的时候,先要在student表里检查是不是有这个同学


--触发器

--触发器是一种特殊的存储过程,只不过这个存储过程是不允许显式调用的

--它只能在做了特定事件,自动触发做出响应

--1.DDL(数据定义语言)

--2.DML(数据操作语言)

--两张临时数据表:inserted/deleted,这两张临时表,只能在触发器中访问

 

 

--触发器是附着在一张表上的。

--语法:

--create trigger 触发器名字

--on 表名

--after|for|instead of    insert | delete | update

--as

--begin

--    ....

--end

 

--触发器的触发条件:insert,delete,update

--例1.

create trigger tr_Bank_insert

on Bank

after insert

as

begin

  print '往bank表中插入了一条记录'

end



insert into Bank values('fifi',100)

 

--例二:当删除一条学生记录的时候,把被删除的学生记录备份到stuBak表中


create table StuBak

(

  id int,

  stuNo char(9),

  stuName nvarchar(4),

  gender bit,

  city nvarchar(16),

  birthday datetime,

  clsId int

)

--写触发器

create trigger tr_Student_Delete

on Tbstudent

for delete

as

begin

  declare @id int

  declare @stuNo char

  declare @stuName nvarchar

  declare @gender bit

  declare @city nvarchar

  declare @birthday datetime

  declare @clsId int

  select @id=id,@stuNo=stuNo,@stuName=stuName,@gender=gender,@city=city,@birthday=birthday,@clsId=clsId from deleted

  insert into StuBak values(@id,@stuNo,@stuName,@gender,@city,@birthday,@clsId)



end

查询:

select * from student

select * from StuBak

--SQL Server的触发器是表级的触发器

--例三.instead of触发器。当录入学生成绩的时候,先要在student表里检查是不是有这个同学

--   如果有这个人的编号,我们就录入成绩,如果没有,就不能录入,

--   并且输出一个“要处理的学生记录不存在”

create trigger tr_Score_Insert

on score

instead of insert

as

begin

  declare @stuId int

  select @stuId = stuId from inserted

  if(exists(select * from Student where id=@stuId))

  begin

     insert into score select stuId stuId,math,english from inserted

  end

  else

  begin

     rollback

     print '要记录的学生不存在'

  end

end

查询:

select * from  score

insert into score values(16,99,98)