目录
--例二:当删除一条学生记录的时候,把被删除的学生记录备份到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)