基于SqlServer环境下创建触发器、级联更新(删除、修改)
生活随笔
收集整理的這篇文章主要介紹了
基于SqlServer环境下创建触发器、级联更新(删除、修改)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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--1創建學校信息表
Create table SchoolInfor
(ScName VARCHAR(20) , --學校名稱
Sprovince VARCHAR(20) not null,--學校所在省份
SbureauEd VARCHAR(20) not null,--學校所屬教育局
Saddress varchar(50) not null,--學校地址
PRIMARY KEY(ScName)
)
--1部別信息表
Create table BubieTable(Bno char(1) unique ,Bname char(4) primary key)
--1年級信息表
Create table NianjiTable(Nno char(1) unique ,Nname char(6) primary key)--1畢業生信息表
Create table BiyeSheng(
Sno char(12),
buBie char(10),
Sname varchar(36),
primary key(Sno)
)--2班級表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),
)
--3入學信息表
Create table StudentInfor --創建學生入學基本信息表
(enrollmentYear char(4) not null,--考慮到年份都是四位數,所以定死為char(4)類型和大小
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),--主鍵
)--4創建學生個人情況
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, --聯系方式11位的手機號PRIMARY KEY(Sno),FOREIGN KEY (Sno) references StudentInfor(Sno) )--4創建學生主要關系表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))--4學籍更改表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))--4創建系統用戶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('黃石二中','湖北省','黃石市教育局','黃石市下陸區揚州路')
-- select*from SchoolInfor
--插入學習類別
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','王麻子');--學校錄取學生時候,由招生辦老師提供的名單,當錄取學生的時候,
--同時為該學生提供一個系統賬戶,賬戶名為學生的學號,密碼默認為123456,賬戶類型為學生賬戶
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--觸發器--當學生入學成績成績小于460時候,學生的錄取類型為借讀生。
CREATE TRIGGER Student_fenshu ON StudentInfor --該觸發器建在學生入學表生
FOR INSERT --觸發器類型 插入記錄時候
as
declare e1 cursor for
select Sno,enrollmentScore,muqianZhuangtai from inserted --觸發器名稱 e1
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 -- 當返回值為0時候繼續執行Begin下語句,知道返回值為-1或者非0
BEGIN IF @enrollmentScore <=460 --入過入學分數小于或者等于460update StudentInfor set sourceUpdate='借讀' --把當前已經輸入的入讀類型為借讀,即使之前是其他也會更改為借讀where @Sno=Sno fetch next from e1 into @Sno,@enrollmentScore,@sourceUpdate --條件為0時候繼續遍歷臨時表中的記錄,知道條件為非0end
close e1 --遍歷游標 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 --那么發給畢業證ENDfetch 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
--當我更改變動類型時候,而且滿足變動類型為畢業,那么到處導出畢業生到BiyeSheng表中 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,'無') ENDfetch 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 --創建賬戶,的登錄賬戶為學號,姓名為學生姓名,權限代碼為4,默認為學生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 為了保持數據的完整性:
我們對相應的表進行了級聯刪除與級聯更新的約束建立,該約束是列級約束,也可以在創建表的時候建立,本實例是創建表后建立的:--對參照StudentInfor學生入學表的表建立級聯更新與刪除alter table StudentGerenInfor add constraint a_Sno foreign key(Sno) references StudentInfor(Sno) on delete cascadealter table SGuanxi add constraint b_Sno foreign key(Sno) references StudentInfor(Sno) on delete cascadealter table xuejiUpdate add constraint c_Sno foreign key(Sno) references StudentInfor(Sno) on delete cascade
總結
以上是生活随笔為你收集整理的基于SqlServer环境下创建触发器、级联更新(删除、修改)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机教师工作事迹介绍,先进个人 信息技
- 下一篇: 转载:windows指令