数据库实验实验11 触发器.docx
- 文档编号:24851073
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:24
- 大小:456.31KB
数据库实验实验11 触发器.docx
《数据库实验实验11 触发器.docx》由会员分享,可在线阅读,更多相关《数据库实验实验11 触发器.docx(24页珍藏版)》请在冰豆网上搜索。
数据库实验实验11触发器
实验报告
一、实验名称和性质
所属课程
数据库原理
实验名称
触发器
实验学时
2
实验性质
✓□验证□综合✓□设计
必做/选做
✓□必做□选做
二、实验目的
1.掌握触发器定义;
2.理解触发器作用及原理
三、实验的软硬件环境要求
硬件环境要求:
PC机(单机)
使用的软件名称、版本号以及模块:
Windows下的SQLServer2005以上版本
四、知识准备
见:
课件
五、实验内容
1.定义触发器;
六、验证性实验--在定义对象名称后加学号后三位
--
(1)理解触发器
createtablet1
(aintprimarykey,
bint)
createtablet2
(aintprimarykey,
bint)
1.insert触发器
createtriggerT_insertont1
forinsert--afterinsert
as
print'Thisisinserttrggger'
select*frominserted
go
--执行每个语句,查看消息
insertt1values(1,1)
updatet1seta+=1wherea=1
deletet1wherea=2
select*fromt1
insertt1values(1,1),(2,2),(3,3),(4,4)
2.deletet触发器
go
createtriggerT_delont1
fordelete--afterdelete
as
print'Thisisdeletetrggger'
select'insert'ins,*frominserted
select'delete'del,*fromdeleted
go
--执行每个语句,查看消息
deletet1wherea=1
deletet1wherea>2
insertt1values(5,5),(6,6)
3.update触发器
go
createtriggerT_upont1
forupdate--afterupdate
as
print'Thisisupdatetrggger'
select'insert'ins,*frominserted
select'delete'del,*fromdeleted
go
--执行每个语句,查看消息
deletet1
insertt1values(1,1),(2,2),(3,3),(4,4)
select*fromt1
updatet1seta=22wherea=2
updatet1seta*=10wherea>2
4.insert,update,delete触发器
go
createtriggerT_allont1
forinsert,update,delete--afterinsert,update,delete
as
print'Thisisinsertupdatedeletetrggger'
select'insert1'ins1,*frominserted
select'delete1'del1,*fromdeleted
go
--执行每个语句,查看消息
insertt1values(15,15)
updatet1seta+=1wherea=15
deletet1wherea=6
5.insteadof触发器
insertt2select*fromt1
go
createtriggerT_insteadont1
insteadofinsert,update,delete--beforeinsert,update,delete
as
print'Thisisinsteadoftrggger'
deletet2fromdeleteddjoint2ond.a=t2.a
insertt2select*frominserted
--执行每个语句,查看消息
go
insertt1values(100,100)
select*fromt1
select*fromt2
updatet1setb=2wherea=1
select*fromt1
select*fromt2
deletet1wherea=1
deletet2
insertt2select*fromt1
--
(2)触发器应用
备份数据至studentA,scoreA,COURSEA,并在这些表上测试
1.①在studentA表上创建触发器t1,在用户插入、修改和删除记录时,都会自动显示表中的内容。
②测试:
对studentA表分别用insert、update和delete语句进行测试。
createtriggert1
onstudentA
afterinsert,update,delete
as
begin
select*fromstudentA
end
insertstudentA(sno)values('112')
deletefromstudentAwheresno='112'
2.①建立一个触发器t2,当向studentA表中插入数据时,如果姓名不重复则插入,如果出现姓名重复的情况,则提示错误(raiserror('姓名重复,不能插入',16,1))并回滚该事务(即取消插入的行)。
②测试:
对studentA表分别用insert语句插入一条姓名重复的记录和姓名不重复的记录进行测试。
createtriggert2
onstudentA
insteadofinsert
as
begin
declare@namechar(10)
select@name=inserted.snamefrominserted
ifexists(selectsnamefromstudentAwheresname=@name)
begin
raiserror('姓名重复,不能插入',16,1)
rollback
end
else
begin
insertintostudentAselectinserted.*frominserted
end
end
insertintostudentA(sno,sname,ssex)values(001,'aaaa','男')
3.①建立一个触发器t3,当向studentA表中插入数据时,如果出现性别不正确的情况,不回滚该事务,只提示错误消息。
②测试:
对studentA表分别用insert语句插入一条性别正确的和性别不正确的记录进行测试。
createtriggert3
onstudentA
afterinsertas
begin
declare@sexchar(5)
select@sex=ssexfrominserted
if@sex<>'男'and@sex<>'女'
raiserror('性别只能取男或女',16,1)
end
---
insertintostudentA(sno,sname,ssex)values(110,'李俊','他')
deletefromstudentAwheresno='110'
4.①一个修改触发器t4,该触发器防止用户修改表studentA的学号。
②测试:
对studentA表分使用update语句修改学号进行测试。
createtriggert4
onstudentA
afterupdate
as
ifUPDATE(sno)
begin
raiserror('不能修改学号',16,2)
rollback
end
updatestudentAsetsno='102'wheresno='101'
5.①建立一个触发器t5,将studentA表中所有修改时改前的记录及修改日期保存到ss表(自己创建)中作为历史记录。
②测试:
使用命令查询studentA表中的信息,再使用命令将studentA表中的1031班改为1032班,然后使用命令查询ss中的记录检查触发器t2是否正确。
createtriggert5
onstudentA
afterupdate
as
insertintoss(editdate,sno,sname,ssex,sbirthday,sclass)
selectGETDATE(),deleted.*fromdeleted
updatestudentAsetsclass='95035'wheresclass='95033'
6.①创建触发器t6,当删除studentA表中的某个学生记录时,应该也同时删除scoreA表中该生的选课记录。
②测试:
在studentA表中添加一条学号为222的学生记录,在scoreA表中添加该学号三条选课记录,然后删除学生表中的该学号的学生记录,检查scoreA表中学号为222的记录是否还存在,从而测试该触发器是否正确。
createtriggert6
onstudentA
afterdelete
as
declare@numchar(5)
select@num=deleted.snofromdeleted
deletefromscoreAwherescoreA.sno=@num
---
insertintostudentA(sno,sname,ssex)values(222,'李俊','男')
insertintoscoreA(sno,cno,degree)values(222,'C001','80')
insertintoscoreA(sno,cno,degree)values(222,'C002','90')
insertintoscoreA(sno,cno,degree)values(222,'C003','100')
deletefromstudentAwheresno=222
7.①创建触发器t7,当修改studentA表中的某个学生学号时,同时也修改scoreA表中该生的学号。
②测试:
使用命令分别查询studentA表和scoreA表中学号为的学生信息,再使用命令将studentA表中101的学号的改为999,然后使用命令再分别查询studentA表和scoreA表中学号为101和的999的记录。
createtriggert7onstudentAafterupdateas
declare@numchar(5)
select@num=deleted.snofromdeleted
updatescoreAsetscoreA.sno=inserted.snofrominsertedwherescoreA.sno=@num
updatestudentAsetsno=999wheresno=101
select*fromstudentAwheresno=999
select*fromscoreAwheresno=999
select*fromstudentAwheresno=101
七、设计性实验在定义对象名称后加学号后三位
1.实验要求
1.模拟销售和库存
--销售表每插入、更新删除商品时,库存自动增减
--库存表:
createtablekc103
(PIDCHAR(3)PRIMARYKEY,--商品号
QUANTITYINT--库存量
)
insertkc103values('101',50),('102',60),('103',70),('104',80)
select*fromkc103
--销售表:
createtablexs103
(XHINTPRIMARYKEYIDENTITY,
SDATEDATEDEFAULTGETDATE(),
PIDCHAR(3),--商品号
QUANTITYINT--销售量
)
select*fromxs103
--.创建触发器T_XS,销售表更新自动更新库存,并测试(插入,更新,删除)。
createtriggerT_xs
onxs103
forinsert,delete,update
as
SETNOCOUNTON
UPDATEKC103SETQUANTITY+=D.QUANTITY
FROMKC103JOINdeletedDONKC103.PID=D.PID
UPDATEKC103SETQUANTITY-=I.QUANTITY
FROMKC103JOINinsertedIONKC103.PID=I.PID
select*fromkc103
--销售
INSERTXS103(PID,QUANTITY)VALUES('101',5)
select*fromkc103
select*fromXS103
--修改销售
UPDATEXS103SETQUANTITY=2WHEREPID='101'
select*fromkc103
select*fromXS103
--退货
DELETEXS103WHEREPID='101'
select*fromkc103
select*fromXS103
--TRUNCATETABLEKCXS
2。
INSTEAD触发器
--备份成绩scoreA表为scoreA1,并把成绩设为0
--相当于已经选课的结果,学生选某课后scoreA1中增加相应成绩为0的记录
--现在插入成绩,实际就是更新成绩,用实际成绩替换0
select*intoScore103A1fromScore103A
updateScore103A1setdegree=0
select*fromScore103A1
createtriggerT_sc
onScore103A1INSTEADOFinsert
as
setnocounton
updateScore103A1setdegree=i.degreefromScore103A1sc
joininsertedionsc.sno=i.Snoandsc.Cno=i.Cno
insertScore103A1values('103','3-105',85)
select*fromScore103A1
--触发器只对insert起作用,对update等没影响
updateScore103A1setdegree+=1wheresno='101'andcno='6-166'
-3.创建表scoreB(xh,kch,cj)xh,kch为主键,为scoreA(SNO,CNO,DEGREE)的备份,用触发器完成对scoreA的任何修改自动反映到scoreB中(scoreB和scoreA数据保持一致).
createtablescoreB103
(
xhchar(3)notnull,
kchchar(5)notnull,
cjdecimal(4,1),
primarykey(xh,kch)
)
insertintoscoreB103select*fromSCORE103A
select*fromscoreB103
go
createtriggerT_scB103
onscore103A
forinsert,delete,update
as
deletescoreB103wherexh=(selectxhfromdeleted)
insertscoreB103select*fromInserted
go
insertintoSCORE103A(sno,cno,Degree)values(666,'1-200','100')
updateSCORE103AsetDegree=95wheresno=666
select*fromSCORE103A
select*fromscoreB103
deleteSCORE103Awheresno=666
--4.创建视图V_scc(sno,sname,cname,degree),在其上创建触发器T_m,实现同时修改姓名和成绩;
createviewV_s103
as
selects.sno,s.sname,ame,sc.degreefromstudent103As
joinSCORE103Asconsc.Sno=s.Sno
joinCourse103cono=o
select*fromV_s103
createtriggerT_m103
OnV_s103
altertriggerT_m103onV_s103
insteadofupdate
as
--select*frominserted
updateStudent103setsname=i.snamefromStudent103sjoininsertedioni.sno=s.Sno
updatescsetGrade=i.gradefromscjoininsertedioni.sno=sc.Sno
joincourse103coname=ameandsc.Cno=c.Cno
5.创建视图V_cj(学号,姓名,课程名,成绩),创建触发器T_V通过视图完成添加成绩!
CREATEVIEW[v_cj103]ASSELECT
dbo.student103.SnoAS[学号],
dbo.student103.SnameAS[姓名],
dbo.Course103.CnameAS[课程名],
dbo.Score103.DegreeAS[成绩]
FROM
dbo.student103,
dbo.Course103
INNERJOINdbo.Score103ONdbo.Score103.Sno=Sno
SELECT*FROM[v_cj103]
CREATETRIGGERT_V
ONv_cj103
INSTEADOFINSERT
2.实验报告要求
(1)写出验证性实验的执行结果;
(2)用T-SQL完成设计性实验并写出执行结果;
(3)收获或问题。
本次实验验证性的问题比较多,需要自己写的就是两三个题,但是验证当中也发现了很多问题,有的时候在自己电脑上跑不了的命令,其他人就能跑,排查后发现是自己的代码有问题,下一步还需要改进。
在最后两题当中也发现有很多问题,有的时候跑不了,还是需要自己细心和看老师的PPT。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库实验实验11 触发器 数据库 实验 11