SQL触发器

--触发器:就是一种特殊的存储过程
--特殊的地方的地方是对数据库表的操作来引发
--存储过程时通过人为的exec来执行

create table Student
(
  Sno varchar(50)primary key not null,        --学号(主码)
  Sname varchar(50) not null,        --学生姓名
  Ssex varchar(50)not null,        --学生性别
  Sbirthday datetime,     --学生出生年月
  Class varchar(50)       --学生所在班级
)
go
--truncate table Student
insert into Student values(‘108‘,‘曾华‘,‘男‘,‘1977-09-01‘,‘95033‘)
insert into Student values(‘105‘,‘匡明‘,‘男‘,‘1975-10-02‘,‘95031‘)
insert into student values(‘107‘,‘王丽‘,‘女‘,‘1976-01-23‘,‘95033‘)
insert into student values(‘101‘,‘李军‘,‘男‘,‘1976-02-20‘,‘95033‘)
insert into student values(‘109‘,‘王芳‘,‘女‘,‘1975-02-10‘,‘95031‘)
insert into student values(‘103‘,‘陆君‘,‘男‘,‘1974-06-03‘,‘95031‘)
create table course
(
 Cno varchar(50)primary key not null,    --课程号(主码)
 Cname varchar(50) not null,    --课程名称
 Tno varchar(50)not null,
 foreign key (Tno)
 references teacher(Tno)      --教工编号(外码)
)
--truncate table course
insert into course values(‘3-105‘,‘计算机导论‘,‘825‘)
insert into course values(‘3-245‘,‘操作系统‘,‘804‘)
insert into course values(‘6-166‘,‘数字电路‘,‘856‘)
insert into course values(‘9-888‘,‘高等数学‘,‘831‘)

create table Score
(
 Sno varchar(50)not null,    --学号(外码)
 Cno varchar(50)not null,    --课程号(外码)
 foreign key (Sno)
 references student(Sno) ,
 foreign key (cno)
 references course(Cno) , 
 Degree	Decimal(4,1)   --成绩
 primary key (Sno,Cno)
)
--truncate table Score
insert into Score values(‘103‘,‘3-245‘,	86)
insert into Score values(‘105‘,‘3-245‘,	75)
insert into Score values(‘109‘,‘3-245‘,	68)
insert into Score values(‘103‘,‘3-105‘,	92)
insert into Score values(‘105‘,‘3-105‘,	88)
insert into Score values(‘109‘,‘3-105‘,	76)
insert into Score values(‘101‘,‘3-105‘,	64)
insert into Score values(‘107‘,‘3-105‘,	91)
insert into Score values(‘108‘,‘3-105‘,	78)
insert into Score values(‘101‘,‘6-166‘,	85)
insert into Score values(‘107‘,‘6-166‘,	79)
insert into Score values(‘108‘,‘6-166‘,	81)
create table Teacher
(
  Tno varchar(50)primary key not null,        --教工编号(主码)
  Tname varchar(50) not null,        --教工姓名
  Ssex varchar(50)not null,        --教工性别
  Sbirthday datetime,     --教工出生年月
  Prof varchar(50)not null,
  Depart Varchar(50)       --教工所在部门
)
truncate table Teacher
insert into Teacher values(‘804‘,‘李诚‘,‘男‘,‘1958-12-02‘,‘副教授‘,‘计算机系‘)
insert into Teacher values(‘856‘,‘张旭‘,‘男‘,‘1969-03-12‘,‘讲师‘,	‘电子工程系‘)
insert into Teacher values(‘825‘,‘王萍‘,‘女‘,‘1972-05-05‘,‘助教‘,	‘计算机系‘)
insert into Teacher values(‘831‘,‘刘冰‘,‘女‘,‘1977-08-14‘,‘助教‘,	‘电子工程系‘)

---------------格式
--create trigger 触发器名
--on 表名
--(for/after)|(instead of) 动作(insert|updata|delete)
--as
--   存储过程内容
--go


--for/after: 先执行操作 在执行触发器
--instead of :直接替换操作
--drop trigger 表名  --删除触发器



select *from Student 
create trigger student_Insert              --创建触发器
on student                          --指定触发器所在表
for Insert            --先执行操作 在执行触发器
as
  update student set sbirthday=‘1999—9—9‘ where sno=‘101‘
go
insert into student values(‘203‘,‘皮特‘,‘男‘,‘1976-02-20‘,‘95033‘)
drop trigger student_Insert



--触发器中的临时表
--触发器中的临时表:deleted,   inserted ?

create trigger Course_Delete 
on course
instead of delete                     --替换了删除    
as
	select *from deleted           --deleted是一个临时表,里面存着你要删除的那些数据、
go
delete from course where cno=‘6-166‘    --执行删除cno=‘3-105‘替换了删除 从deleted临时表会显示你要删除的内容
select*from score
select*from course
drop trigger course_delete     --删除触发器



create trigger Course_Delete                     --删除你想要删除的数据      级联删除
on course
instead of delete
as
	delete from score where cno in (select cno from deleted)      --要删除主键内容 必须先删掉外键内容 才能删除主键内容
	delete from course where cno in (select cno from deleted)        
go
delete from course where cno=‘3-245‘
select*from score
select*from course
drop trigger course_delete


--删除前先备份数据到备份表之后再删除

 create table scorebak              --先创建备份表
(
	ids int identity(1,1) primary key ,
	sno varchar(50),
	cno varchar(50),
	degree decimal(18,2),
	datetimes datetime
)
create trigger Score_delete          --创建触发器
on score
instead of delete
as
	declare @count int     --定义变量
	select @count=count(*) from deleted  --计算deleted里面共有的数据   
	
	declare @i int    --  定义变量                    
	set @i=0       --赋值 定义0 下面的分页排除第0行 从第一页开始 一行一页
	while @i<@count  --循环遍历deleted临时表的数据,然后转移
	begin
		declare @sno varchar(20)   --定义三个变量来接收score里面的三个列
		declare @cno varchar(20)
		declare @degree decimal(4,1)
		
		select top 1 @sno=sno,@cno=cno,@degree=degree from deleted         -- 分页 这是组合键   不是组合键的话  只写主键的就可以
		where sno not in (select top (@i) sno from deleted)
		or cno not in (select top (@i) cno from deleted )
		
		insert into scorebak values(@sno,@cno,@degree,getdate())   --往新的表里添加从score删除的数据
		
		delete from score where sno=@sno and cno=@cno            --删除score里面的数据
 
		set @i=@i+1                --根据@i加1 一行一行的循环
	end
	
go 
delete from score where cno=‘3-105‘

 select*from score
 select*from scorebak

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。