触发器.docx
- 文档编号:2809768
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:14
- 大小:17.95KB
触发器.docx
《触发器.docx》由会员分享,可在线阅读,更多相关《触发器.docx(14页珍藏版)》请在冰豆网上搜索。
触发器
/*例15.1在student表上创建触发器,在用户插入、修改和删除记录时,都会自动显示表中的内容:
*/
useschool
go
createtriggertrigoponstudent
afterinsert,delete,update
as
begin
setnocounton
select*fromstudent
end
go
insertstudent(sno)values('1')
go
----------------------------------
/*例15.2在数据库test中创建表table10,创建一个触发器trig1,
在表table10中插入、修改和删除记录时,自动显示表中的内容:
*/
usetest
go
createtabletable10--创建表table9
(c1int,
c2char(30))
go
createtriggertrig1ontable10--创建触发器
forinsert,update,delete
as
select*fromtable10
go
inserttable10values(1,'林冲')
updatetable10setc2='宋江'wherec1=1
execsp_helptexttrig1--查看触发器内容
execsp_helptriggertable10--查看触发器的属性
execsp_dependstrigcopy1
createtriggertrig4ontable10
forinsert,update,delete
as
PRINT'ABC'
go
---------------------------------
/*例15.3下例说明inserted表和deleted表的作用*/
usetest
go
deletetable10
go
ifexists(selectnamefromsysobjectswherename='trig1'andtype='TR')
droptriggertrig1
go
createtriggertrig1
ontable10
afterinsert,update,delete
as
print'inserted表'
select*frominserted
print'deleted表'
select*fromdeleted
go
setnocounton
inserttable10values(2,'吴用')
updatetable10setc2='关胜'wherec1=2
deletetable10wherec1=2
---------------------------------
/*创建触发器trig2用来检查插入或修改的c1的值是否在1-108之间:
*/
usetest
go
createtabletable10
(c1int,
c2char(10))
go
createtriggertrig2
ontable10
forinsert,update
as
declare@c1_1int
select@c1_1=c1frominserted
if@c1_1<1or@c1_1>108
begin
rollback
raiserror('c1值必须在1到108之间!
',16,1)
end
--select*frominserted
go
inserttable10values(200,'武松')
select*fromtable10
inserttable10values(15,'武松')
select*fromtable10
updatetable10setc1=300wherec2='武松'
select*fromtable10
---------------------------------
/*创建触发器trig3,当删除student表中的学生记录时,应该同时删除score表中对应的记录,
实现该功能的触发器如下:
*/
useschool
go
createtriggertrig3
onstudent
fordelete
as
deletescore
wherescore.sno=(selectsnofromdeleted)
go
insertstudentvalues(200,'陈功','男','1975-1-1','95105')
insertscorevalues(200,'3-105',88)
insertscorevalues(200,'6-166',88)
go
select*fromstudent
select*fromscore
go
/*execsp_helpscore--查看其中外键
altertablescore--删除外键
dropCONSTRAINTFK_score_course
altertablescore
dropCONSTRAINTFK_score_student*/
deletestudentwheresno=200
go
select*fromstudent
select*fromscore
go
---------------------------------
/*例15.4建立一个触发器trigname,当向student表中插入数据时,
如果姓名不重复则插入数据
如果出现姓名重复的情况,则回滚该事务*/
useschool
go
createtriggertrigname3
onstudent
insteadofinsert
as
begin
declare@namechar(10)
select@name=inserted.snamefrominserted
ifexists(selectsnamefromstudentwheresname=@name)
begin
raiserror('姓名重复,不能插入',16,1)--raiserror函数返回用户定义的错误信息,第一个参数指出错误消息,第二个参数指出错误消息的级别,的三个参数指出错误消息的状态。
rollback--回滚
end
else
begin
insertintostudentselectinserted.*frominserted
end
end
--执行以下插入语句,观察结果
insertintostudent(sno,sname,ssex)values(102,'国丽','女')
go
select*fromstudent
---------------------------------
/*例15.5建立一个触发器trigsex,当向student表中插入数据时,
如果出现性别不正确的情况,不回滚该事务,只提示错误消息*/
useschool
go
createtriggertrigsex
onstudent
afterinsert
as
begin
declare@s1char
(1)
select@s1=ssexfrominserted
if@s1<>'男'or@s1<>'女'
raiserror('性别只能取男或女',16,1)
end
go
--执行以下程序,观察结果
useschool
go
insertintostudent(sno,ssex)values('1','M')
go
select*fromstudent
---------------------------------
/*例15.6建立一个修改触发器trigno,
该触发器防止用户修改表student的学号*/
useschool
go
createtriggertrigno
onstudent
afterupdate
as
ifupdate(sno)
begin
raiserror('不能修改学号',16,2)
rollback
end
go
--执行以下程序,观察结果
useschool
go
updatestudentsetsno='2'wheresno='1'
go
select*fromstudent
---------------------------------
/*例15.7建立一个触发器trigcopy,
将student表中所有修改的数据及修改日期保存到studnet1表中作为历史记录*/
useschool
go
ifexists(selectnamefromsysobjectswherename='student1'andtype='U')
droptablestudent1
createtablestudent11
(rqdatetime,--该字段放修改日期
snochar(5),
snamechar(10),
ssexchar
(2),
sbirthdaydatetime,
sclasschar(10))
go
/*createtriggertrigcopy
onstudent
afterupdate
as
insertintostudent1(rq,sno,sname,ssex,sbirthday,sclass)
selectgetdate(),inserted.sno,inserted.sname,inserted.ssex,inserted.sbirthday,inserted.sclass
fromstudent,inserted
wherestudent.sno=inserted.sno
go*/
createtriggert2
onstudent
afterupdate
as
insertintostudent11(rq,sno,sname,ssex,sbirthday,sclass)
selectgetdate(),inserted.*
frominserted
go
--执行以下程序,观察结果
--修改班号
updatestudentsetclass='95031'whereclass='96031'
select*fromstudent11
go
--恢复班号
updatestudentsetsclass='95031'wheresclass='96031'
select*fromstudent1
---------------------------------
/*例15.8建立一个删除触发器trigclass,
该触发器防止用户删除表student中所有95031班的学生记录。
*/
useschool
go
createtriggertrigclass
onstudent
after
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 触发器