SQLServer2008数据库实用技术参考例题(9)存储过
存储过程和触发器例121
例121简单存储过程举例,查询不及格课程超过4门的学生并将其信息存入退学表
CREATEPROCQueryProc
AS
INSERTINTOtuixue
SELECT
FROMstuinfo
WHEREstuidIN(SELECTstuid
FROMstugrade
WHEREgrade60
GROUPBYstuid
HAVINGCOUNT()4
);
例122
122带参数从存储过程举例,输入学号和课程号,输出成绩
CREATEPROCQueryGrade
(
stuidVARCHAR(10),
coursenameVARCHAR(20),
gradeINTOUTPUT
)
AS
SELECTgradegrade
FROMstugrade,courseinfo
WHEREstugrade。courseidcourseinfo。courseid
ANDstuidstuidANDcoursenamecoursename
例123
例123修改存储过程示例,将存储过程QueryProc修改为查询某个学生不及格的课程数
ALTERPROCQueryProc
(
stuidVARCHAR(10),
numINTOUTPUT
)
AS
SELECTnumCOUNT()
FROMstugrade
WHEREgrade
例124
例124执行存储过程QueryProc
EXECQueryProc例125
例125按顺序给参数赋值,执行存储过程例QueryGrade,查询2007070201的操作系统这门课的成绩
DECLAREscoreINT
EXECQueryGrade2007070201,操作系统,scoreOUTPUT
SELECTscore
例126
126按名称对参数赋值
DECLAREscoreINT
EXECQueryGradestuid2007070101,
coursename操作系统,
gradescoreOUTPUT
SELECTscore
例127
例127使用输出参数返回数据,返回某个系的学生个数
CREATEPROCCountProc1
(
deptnameVARCHAR(20),
numINTOUTPUT
)
AS
SELECTnumcount()
FROMstuinfo
WHEREsdeptdeptname例128
例128使用Return语句返回执行状态
CREATEPROCCountProc2
(
deptnameVARCHAR(20),
numINTOUTPUT
)
AS
IFdeptname
BEGIN
PRINT请输入系名!
RETURN1
END
SELECTnumcount()
FROMstuinfo
WHEREsdeptdeptname
IFnum0
BEGIN
PRINT系名不正确,或该系目前没有学生
RETURN2
END
RETURN0
例129
例129INSERT触发器示例。在课程表中插入新的课程时,检查插入的记录是否满足参照完整性
CREATETRIGGERinsertcourseONcourseinfo
FORINSERT
AS
DECLAREprecourseidCHAR(3)
SELECTprecourseidprecourseidFROMinserted
IFprecourseidnotIN(SELECTcourseidFROMcourseinfo)
BEGIN
RAISERROR(输入的先行课程不存在!,16,10)
ROLLBACKTRAN
END
例1210
例1210创建一个Update触发器,防止用户修改学生的入学成绩
CREATETRIGGERupdatestuonstuinfo
FORUPDATE
AS
IFUPDATE(mark)
BEGIN
RAISERROR(不能修改入学成绩!,16,10)
ROLLBACKTRAN
END
例1211
例1211创建一个delete触发器,将删除的记录存入一个备份表
CREATETRIGGERdeletestuonstuinfo
FORDELETE
AS
INSERTINTOstubackup
SELECTFROMdeleted
例1212
例1212创建Update触发器实现级联修改
CREATETRIGGERupdatecourseONcourseinfo
FORUPDATE
AS
DECLAREnewidCHAR(3),oldidCHAR(3)
SELECTnewidcourseidFROMinserted
SELECToldidcourseidFROMdeleted
IFUPDATE(courseid)
UPDATEcourseinfo
SETprecourseidnewid
WHEREprecourseidoldid
例1213
例1213设计DDL触发器,紧张修改和删除当前数据库中的任何表
CREATETRIGGERsafety
ONDATABASE
FORDROPTABLE,ALTERTABLE
AS
PRINT不能修改和删除表!
ROLLBACK
;
例1214
例1214创建登录触发器如果某登录帐号已经创建5次,则禁止该登录帐号的登录尝试
CREATETRIGGERconnectlimittrigger5
ONALLServer
FORLogon
AS
BEGIN
IF(SELECTcount()FROMsys。dmexecsessions
WHEREisuserprocess1ANDoriginalloginnameORIGINALLOGIN())5
ROLLBACK
END
;例1215
例1215删除触发器insertcourse
DROPTRIGGERinsertcourse
例1216
例1216删除DDL触发器safety
DROPTRIGGERsafetyONDATABASE
例1217
例1217删除登录触发器connectionlimittrigger
DROPTRIGGERconnectlimittriggerONALLSERVER