SQLserver 环境下触发器以及级联更新与删除
该文触发器是根据本作者对中学学籍管理系统项目数据库需求分析后得出,已经实验论证完毕,以下是实例的创建以及触发器的实现过程,本作者的百度文库中目录下可以找到数据库课程设计文档中可供参考,该文档涉及本系统的系统从头到尾的设计需求以及数据库实施等阶段一直到数据库的应用,以及数据库中的三级模式两级映像。
中学学籍管理系统数据库物理逻辑结构:
use master
CREATE DATABASE SDbase
ON PRIMARY
(
NAME='SDbase_Data',
FILENAME='D:\SQLSDbase\SDbase_Data.mdf',
SIZE=5MB,
MAXSIZE=100MB,
FILEGROWTH=15%
)
LOG ON
(
NAME='SDbase_Log',
FILENAME='D:\SQLSDbase\SDbase_Log.ldf',
SIZE=5MB,
FILEGROWTH=0
)
GO
中学学籍管理系统表创建:
use SDbase
Create table SchoolInfor
(ScName VARCHAR(20) ,
Sprovince VARCHAR(20) not null,
SbureauEd VARCHAR(20) not null,
Saddress varchar(50) not null,
PRIMARY KEY(ScName)
)
Create table BubieTable(Bno char(1) unique ,Bname char(4) primary key)
Create table NianjiTable(Nno char(1) unique ,Nname char(6) primary key)
Create table BiyeSheng(
Sno char(12),
buBie char(10),
Sname varchar(36),
primary key(Sno)
)
Create table classTbale
(buBie char(4) ,
nianJi char(6),
banJi char(6) not null,
TeacherNo varchar(12) unique NOT NULL,
TeacherName varchar(50) not NULL,
primary key(buBie,nianJi,banJi),
foreign key(buBie) references BubieTable(Bname),
foreign key(nianJi) references NianjiTable(Nname),
)
Create table StudentInfor
(enrollmentYear char(4) not null,
Sno char(12),
buBie char(4) ,
nianJi char(6),
banJi char(6),
Sname varchar(50) not null,
Ssex char(2) check(Ssex in('男','女')),
Nationnality varchar(30) not null,
placeBirth varchar(20)not null,
birthDate Date not null,
graduatedUniversity VARCHAR(20) not null,
enrollmentScore smallint check(enrollmentScore>=0),
sourceUpdate char(10) not null,
muqianZhuangtai Varchar(30),
PRIMARY KEY (Sno),
foreign key(buBie) references BubieTable(Bname),
foreign key(nianJi) references NianjiTable(Nname),
)
Create table StudentGerenInfor
(Sno char(12),
mianMao char(12) not null,
shenTi char(10) ,
jiaTingRenKou char(2),
homeAdress VARCHAR(30) not null,
TemlePhone char(11) not null,
PRIMARY KEY(Sno),
FOREIGN KEY (Sno) references StudentInfor(Sno)
)
Create table SGuanxi
(Sno char(12),
chengWei char(4),
Name varchar(50) NOT NULL,
Age CHAR(3) NOT NULL,
DanWei VARCHAR(50)NOT NULL,
PRIMARY KEY (Sno,chengWei,Name),
FOREIGN KEY (Sno) references StudentInfor(Sno)
)
Create table xuejiUpdate
(
Sno char(12),
updateType char(4),
updateDate DATETime,
yuanYin varchar(50),
SendOrYanZheng VARCHAR(50),
PRIMARY KEY(Sno,updateDate),
foreign key (Sno) references StudentInfor(Sno)
)
Create table UserType
(userID varchar(12),
userPassWord varchar(18),
name varchar(50),
dengJi char(1),
shuoMing varchar(50),
primary key (userID)
)
数据的载入:
use SDbase
insert into SchoolInfor values('黄石理工附中','湖北省','黄石市教育局','黄石市下陆区团城山街道')
insert into SchoolInfor values('黄石二中','湖北省','黄石市教育局','黄石市下陆区扬州路')
insert into BubieTable values('1','小学');
insert into BubieTable values('2','初中');
insert into BubieTable values('3','高中');
insert into NianjiTable values('1','一年级');
insert into NianjiTable values('2','二年级');
insert into NianjiTable values('3','三年级');
insert into NianjiTable values('4','四年级');
insert into NianjiTable values('5','五年级');
insert into NianjiTable values('6','六年级');
select * from NianjiTable
insert into classTbale values('小学','一年级','1','01','张三');
insert into classTbale values('小学','二年级','2','02','李四');
insert into classTbale values('小学','三年级','3','03','王五');
insert into classTbale values('初中','一年级','1','04','李大勇');
insert into classTbale values('初中','二年级','2','05','李晓勇');
insert into classTbale values('初中','三年级','3','06','李勇');
insert into classTbale values('高中','一年级','1','07','张十三');
insert into classTbale values('高中','二年级','2','08','张山');
insert into classTbale values('高中','三年级','3','09','王麻子');
insert into StudentInfor values('2020','202020491111','初中','一年级','1','余欣','女','汉族','襄阳','1999-01-28','湖北理工','480','录取','无');
insert into StudentInfor values('2016','201616491110','初中','二年级','2','张一','男','汉族','恩施','1997-11-06','湖北理工','490','录取','无');
insert into StudentInfor values('2017','201717491101','初中','三年级','3','张二','女','汉族','十堰','1998-01-01','湖北理工','510','休学','无');
insert into StudentInfor values('2020','202020491155','高中','一年级','1','张四','女','汉族','宣恩','2000-01-11','湖北理工','489','休学','无');
insert into StudentInfor values('2017','201717491170','高中','二年级','2','张五','女','汉族','洛阳','1997-12-25','湖北理工','490','录取','无');
insert into StudentInfor values('2018','201616491180','高中','三年级','3','张六','女','汉族','商丘','1998-03-03','湖北理工','470','录取','无');
insert into StudentGerenInfor values('202020491111','团员','健康','5','襄阳','10010100861');
insert into StudentGerenInfor values('201616491110','团员','健康','3','恩施','10086100861');
insert into StudentGerenInfor values('201717491101','群众','健康','4','十堰','10011100861');
insert into StudentGerenInfor values('202020491155','党员','健康','7','宣恩','10086100101');
insert into StudentGerenInfor values('201717491170','团员','健康','8','洛阳','10010100101');
insert into StudentGerenInfor values('201616491180','团员','健康','4','商丘','10011100811');
insert into SGuanxi values('202020491111','陈思','母亲','43','在家');
insert into SGuanxi values('202020491111','陈十','父亲','43','在家');
insert into SGuanxi values('201616491110','陈一','母亲','40','在家');
insert into SGuanxi values('201616491110','陈二','母亲','40','在家');
insert into SGuanxi values('201717491101','陈三','母亲','43','在家');
insert into SGuanxi values('201717491101','陈五','母亲','40','在家');
insert into SGuanxi values('202020491155','王一','母亲','40','在家');
insert into SGuanxi values('202020491155','王二','父亲','40','在家');
insert into SGuanxi values('202020491155','王三','姐姐','25','在家');
insert into SGuanxi values('201717491170','陈六','母亲','40','在家');
insert into SGuanxi values('201717491170','陈七','父亲','42','在家');
insert into SGuanxi values('201616491180','陈八','母亲','43','在家');
insert into SGuanxi values('201616491180','陈九','母亲','43','在家');
创建相应的触发器一共6种情况:
use SDbase
CREATE TRIGGER Student_fenshu ON StudentInfor
FOR INSERT
as
declare e1 cursor for
select Sno,enrollmentScore,muqianZhuangtai from inserted
declare @Sno char(12)
declare @enrollmentScore smallint
declare @sourceUpdate char(10)
OPEN e1
fetch NEXT FROM e1 into @Sno,@enrollmentScore,@sourceUpdate
WHILE @@FETCH_STATUS=0
BEGIN
IF @enrollmentScore <=460
update StudentInfor set sourceUpdate='借读'
where @Sno=Sno
fetch next from e1 into @Sno,@enrollmentScore,@sourceUpdate
end
close e1
DEALLOCATE e1
Create TRIGGER Student_biye ON xuejiUpdate
FOR insert
as
declare e_biye cursor for
select Sno,updateType,SendOrYanZheng from inserted
declare @Sno varchar(36)
declare @updateType char(4)
declare @SendOrYanZheng VARCHAR(50)
OPEN e_biye
fetch NEXT FROM e_biye into @Sno,@updateType,@SendOrYanZheng
WHILE @@FETCH_STATUS=0
BEGIN
if @updateType='毕业'
BEGIN
update xuejiUpdate set SendOrYanZheng='发给毕业证' where @Sno=Sno
END
fetch next from e_biye into @Sno,@updateType,@SendOrYanZheng
end
close e_biye
DEALLOCATE e_biye
CREATE TRIGGER biye_tig ON StudentInfor
FOR update
as
declare e_insertBiye cursor for select Sno,Sname,buBie,sourceUpdate from inserted
declare @Sno char(12)
declare @Sname varchar(36)
declare @buBie char(4)
declare @sourceUpdate char(10)
OPEN e_insertBiye
fetch NEXT FROM e_insertBiye into @Sno,@Sname,@buBie,@sourceUpdate
WHILE @@FETCH_STATUS=0
BEGIN
if update(sourceUpdate) and @sourceUpdate='毕业'
insert into BiyeSheng values(@Sno,@Sname,@buBie)
fetch next from e_insertBiye into @Sno,@Sname,@buBie,@sourceUpdate
end
close e_insertBiye
DEALLOCATE e_insertBiye
Create TRIGGER Student_baingeng ON StudentInfor
FOR update
as
declare e cursor for select Sno,muqianZhuangtai,sourceUpdate from inserted
declare @Sno varchar(36)
declare @muqianZhuangtai char(10)
declare @sourceUpdate char(10)
OPEN e
fetch NEXT FROM e into @Sno,@muqianZhuangtai,@sourceUpdate
while @@FETCH_STATUS=0
BEGIN
if update(sourceUpdate)
BEGIN
insert into xuejiUpdate values(@Sno,@sourceUpdate,getDate(),@muqianZhuangtai,'无')
END
fetch next from e into @Sno,@muqianZhuangtai,@sourceUpdate
end
close e
DEALLOCATE e
CREATE TRIGGER Student_Chufa ON StudentInfor
FOR INSERT
as
declare e cursor for select Sno,Sname from inserted
declare @Sno varchar(36)
declare @Sname varchar(36)
OPEN e
fetch NEXT FROM e into @Sno,@Sname
WHILE @@FETCH_STATUS=0
BEGIN
insert into UserType values(@Sno,123456,@Sname,4,'学生')
fetch next from e into @Sno,@Sname
end
close e
DEALLOCATE e
CREATE TRIGGER Class_Table ON classTbale
FOR INSERT
as
declare e cursor for select TeacherNo,TeacherName from inserted
declare @TeacherNo varchar(12)
declare @TeacherName varchar(50)
OPEN e
fetch NEXT FROM e into @TeacherNo,@TeacherName
WHILE @@FETCH_STATUS=0
BEGIN
insert into UserType values(@TeacherNo,123456,@TeacherName,2,'老师')
fetch next from e into @TeacherNo,@TeacherName
end
close e
DEALLOCATE e
为了保持数据的完整性:
我们对相应的表进行了级联删除与级联更新的约束建立,该约束是列级约束,也可以在创建表的时候建立,本实例是创建表后建立的:
alter table StudentGerenInfor add constraint a_Sno foreign key(Sno) references StudentInfor(Sno) on delete cascade
alter table SGuanxi add constraint b_Sno foreign key(Sno) references StudentInfor(Sno) on delete cascade
alter table xuejiUpdate add constraint c_Sno foreign key(Sno) references StudentInfor(Sno) on delete cascade