实验四存储与触发器资料Word格式文档下载.docx
《实验四存储与触发器资料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验四存储与触发器资料Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
5、使用不同参数传递值方式执行存储过程。
6、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中的学生人数,默认班级编号为‘20031340000102’。
7、定义一个变量用来存储存储过程Proc_GetClassStudent3返回的值。
8、创建一个返回执行代码为100的存储过程。
9、执行存储过程Proc_GetClassStudent2和Proc_GetClassStudent4,并定义两个个变量存储执行返回代码。
10、在commoditysell中创建一个名为GetFactProd的存储过程,用于实现:
由执行该存储过程时提供的厂家的名称,查询其生产的产品信息,返回产品的ProdID、ProdName、UnitPrice和StockAmount。
(使用“四川绵阳”和“上海黄埔”两个厂家的名称执行存储过程)
11、在commoditysell中创建一个名为SellProdAmount的存储过程,用于实现:
由执行该存储过程时提供的商场的名称,查询其销售的产品数量,并用输出参数输出销量数。
(使用“双桥子商场”和“十陵商场”两个商场名称执行程存储过程)
12、设计一个简单的AFTERINSERT触发器,这个触发器的作用是:
在插入一条记录的时候,发出“又添加了一个学生的成绩”的友好提示。
13、在score表中创建触发器,在向score表中插入数据时,先检待插入的数据中的sno和cno是否存在于student表和sc表中,如果不存在则不允许插入。
14、创建一个触发器,当删除student表中的数据时,需要判断该数据对应的学生是否有选课,如果有,也需要将其选课信息全部删除。
15、在score表上创建一个insteadofinsert触发器,实现:
当向表score插入记录时检查分数的合理性,如果不合理就不进行插入操作,否则允许。
16、在score表上创建一个insteadofdelete触发器,实现:
当从表score删除记录时检查各课程的成绩是否为空,如果为空就不允许进行删除操作,否则允许。
17、在score表上创建一个insteadofupdate触发器,实现:
当从表score更新记录时检查当前用户是否是dbo,如果不是dbo就不允许进行更新操作,否则允许。
18、给sell表创建一个afterinsert触发器,实现:
当向sell插入一条记录时,修改stock表stock_amount(库存数量),值等于stock_amount-sell_amount,还有修改时间modified_date,并显示相应的提示信息:
“库存量还剩余stock_amount-sell_amount”,当(stock_amount-sell_amount)<
0时,不允许进行插入操作,即操作回滚,并显示相应的提示信息:
“库存量不足,只有stock_amount”。
四、实验步骤
createprocedureProcStudentInfo
as
select学号,姓名,性别,班级编号,年级,籍贯from学生信息
executeProc_StudentInfo
3、创建一个存储过程
,用于返回“教务管理系统”数据库上某个班级中所有学生的信息。
CREATEPROCEDUREProc_GetClassStudent1
@ClassIDvarchar(14)
AS
SELECT学号,姓名,性别,班级编号,年级,籍贯FROM学生信息
WHERE班级编号=@ClassID
REATEPROCEDUREProc_GetClassStudent2
@ClassIDvarchar(14)='
AS
SELECT学号,姓名,性别,班级编号,年级,籍贯FROM学生信息
WHERE班级编号=@ClassID
EXECProc_GetClassStudent2
EXECProc_GetClassStudent2'
20031340000101'
EXECProc_GetClassStudent2@ClassID='
20031340000104'
6、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中的学生人数,默认班级编号为‘20031340000102’
use教务管理系统
go
CREATEPROCEDUREProc_GetClassStudent3
@ClassIDvarchar(14)='
as
SELECTcount(学号)as学生人数FROM学生信息where班级编号
=@classid
EXECUTEProc_GetClassStudent3'
createprocedureProc_GetClassStudent3@banjichar(14),@outnumeric(3,0)output
select@out=人数from班级信息
where班级编号=@banjiand@banji='
declare@outnumeric(3,0)
executeProc_GetClassStudent3'
@outoutput
select@outas人数
USE教务管理系统
GO
CREATEPROCEDUREProc_GetClassStudent4@ClassIDvarchar(14)
ASBEGIN
SELECT学号,姓名,性别,班级编号,年级,籍贯FROM学生信息WHERE班级编号=@ClassIDRETURN100END
DECLARE@return1int,@return2int
EXEC@return1=Proc_GetClassStudent2'
EXEC@return2=Proc_GetClassStudent4'
SELECT@return1
SELECT@return2
usecommoditysell
createprocedureGetFactProd@厂名char(8)
selectProdID,ProdName,UnitPrice,StockAmountfromProductInfo
whereFactAddr=@厂名
executeGetFactProd'
四川绵阳'
上海黄埔'
createprocedureSellProdAmount@名称varchar(10),@数量varchar(10)output
select@数量=SellAmoutfromEmporiumSell
whereEmpID=(selectEmpIDfromEmporiumInfowhereEmpName=@名称)
双桥子商场'
十陵商场'
11、设计一个简单的AFTERINSERT触发器,这个触发器的作用是:
先建立三个表:
createtablescore
(
snochar(9),
cnoint,
gradeint
)
createtablestock(
prod_idchar(10),
prod_namevarchar(10),
unit_priceint,
stock_amountint,
modified_datedatetime
createtablesell(
order_idintidentity(1,1),
sell_amountint,
sell_datedatetime,
Salervarchar(10)
接着:
createtriggeradd_sconscore
afterinsert
begin
print'
又添加了一个学生的成绩'
end
insertintoscorevalues('
20110523'
23,50)
12、在score表中创建触发器,在向score表中插入数据时,先检待插入的数据中的sno和cno是否存在于student表和sc表中,如果不存在则不允许插入。
CREATEtriggeradd_sc2onscore
declare@snochar(9)
select@sno=sno
fromstudent
wheresno=(selectsnofrominserted)
if@snoisnull
begin
rollbacktransaction
print'
不存在这样的学生学号!
'
--raiserror('
16,20)
end
13,80)
USEcommoditysell
GO
INSERTINTOscore
values('
20110529'
13、创建一个触发器,当删除student表中的数据时,需要判断该数据对应的学生是否有选课,如果有,也需要将其选课信息全部删除。
CREATEtriggerdel_stuonstudent
afterdelete
fromscore
wheresno=(selectsnofromdeleted)
if@snoisnotnull
deletefromscorewheresno=@sno
该学生的选课记录也已经删除!
insertintostudentvalues('
20110526'
'
李明'
男'
19,'
计算机'
deletefromstudentwheresno='
select*fromscore
14、在score表上创建一个insteadofinsert触发器,实现:
CREATEtriggeradd_sc3onscore
insteadofinsert
declare@gradeint
select@grade=grade
frominserted
if@grade<
0or@grade>
100
该学生的成绩不合理!
20110525'
13,-80)
15、在score表上创建一个insteadofdelete触发器,实现:
CREATETRIGGERscore_insert_delete
onscore
insteadofdelete
begin
SETNOCOUNTON
declare@snochar(9),@cnoint,@gradeint
select@sno=sno,@cno=cno,@grade=gradefrom
deleted
if(@gradeisNULL)
成绩为空,不允许删除该记录!
else
deletefromscorewheresno=@snoandcno=@cno
16、在score表上创建一个insteadofupdate触发器,实现:
CREATEtriggerdelete_sconscore
declare@cjint
select@cj=grade
fromdeleted
if@cjisnull
有课程成绩为空,不允许删除!
17、给sell表创建一个afterinsert触发器,实现:
ALTERtriggerscore_update_instead
insteadofupdate
declare@sno1varchar(10),@sno2varchar(10),@current_uservarchar(10)
select@sno1=sno
frominserted
select@sno2=sno
fromdeleted
if(current_user!
='
dbo'
rollbacktransaction
不是dbo用户不能修改学生姓名信息'
else
updatescore
setsno=@sno1
wheresno=@sno2
end
五、实验总结
在本次实验中,要求了解存储过程的概念和作用,掌握创建存储过程的方法。
在写代码的过程中,虽然时常发现有困难,但是在同学和老师的共同帮助下,还是很认真的写出了结果,同时也加深了我们对数据库的了解。