数据库第四次实验报告

南昌航空大学实验报告

二0一 年 月 日

课程名称: 数据库概论 实验名称: 存储过程及触发器

班级: 姓名: 同组人:

指导教师评定: 签名:

实验参考代码及结果

存储过程:

创建存储过程

9.11

CREATE PROCEDURE Select_S AS SELECT * FROM S WHERE sex='女'

GO

Execute Select_S

9.12

CREATE PROCEDURE InsRecToS(@sno char(5),@sn varchar(8),@sex char(2)='男',@age int,@dept varchar(20))

AS INSERT INTO S VALUES(@sno,@sn,@sex,@age,@dept)

GO

Execute InsRecToS @sno='S8',@sn='罗兵',@age='18',@dept='信息'

执行前:

执行后:

9.13

CREATE PROCEDURE Query_S(@Sno char(5),@SN VARCHAR(8) OUTPUT,@Age SMALLINT OUTPUT)

AS

SELECT @sn=sn,@age=age

FROM S

WHERE Sno=@Sno

(2)执行存储过程

Declare @SN VARCHAR(8),@AGE SMALLINT

execute Query_S '98010',@SN OUTPUT,@AGE OUTPUT

SELECT @SN,@AGE

(3)查看和修改存储过程

9.14

ALTER PROCEDURE[dbo].[InsRecTos] (@sno char(5),@sn varchar(8),@sex char(2)='女',@age smallint,@dept varchar(20))

AS

INSERT

INTO S

VALUES(@sno,@sn,@sex,@age,@dept)

(4)查看、重命名和删除存储过程

9.15

exec sp_helptext Select_S

9.16

sp_rename Select_S,Select_Student

执行后:

9.17

DROP PROCEDURE Select_Student

执行后:

(5)在DingBao数据库中创建存储过程C_P_Proc,实现参数化查询顾客订阅信息,查询参数为顾客姓名,要求能查询出参数指定顾客的顾客编号、顾客名、订阅报纸名及订阅报纸份数等信息。

CREATE PROCEDURE C_P_Proc(@ccna varchar(10),@cno char(4) OUTPUT,@cna varchar(10) OUTPUT,@pna varchar(20) OUTPUT,@num int OUTPUT)

AS

SELECT @cna=cna,@cno=cp.cno,@pna=pna,@num=num

FROM cp,customer,paper

WHERE customer.cno=cp.cno AND paper.pno=cp.pno AND cna=@ccna;

(6)执行存储过程C_P_Proc,实现对“李涛”等不同顾客的订阅信息的查询。

Declare @cno char(4),@cna varchar(10),@pna varchar(20) ,@num int

execute C_P_Proc '李涛',@cno OUTPUT,@cna OUTPUT,@pna OUTPUT,@num OUTPUT

SELECT @cno,@cna,@pna,@num

(7)删除储过程C_P_Proc

DROP PROCEDURE C_P_Proc

执行前:

执行后:

触发器:

创建触发器

10.19

CREATE TRIGGER TR_S_Age_update on S

for update as

declare @iAge int;

select @iAge=age

from inserted

if @iAge<8 or @iAge>45

begin

raiserror('学生年龄应该大于等于,并小于等于',16,1)

rollback transaction

end

执行:

UPDATE s

SET age=48

WHERE sno='98010'

10.20

CREATE TRIGGER Change_S_Sel ON S

FOR INSERT,UPDATE,DELETE

AS

SELECT *

FROM S

执行:

(2)触发器的引用

INSERT

if exists(select name from sysobjects where name='TR_C_insert' and type='TR')

DROP TRIGGER TR_C_insert

go

CREATE TRIGGER TR_C_insert ON c

for insert as

declare @iCT int;

SELECT @iCT=CT

FROM inserted

if @iCT <1 or @iCT>10

begin

raiserror('课程学分应大于等于,小于等于.',16,1)

rollback transaction

end

执行:

INSERT

INTO c(cno,cn,ct)

VALUES ('C8','运筹学',0.5)

DELETE

CREATE TRIGGER TR_S_delete ON s

for delete

as

declare @icount int

select @icount=count(*)

from deleted,sc

where deleted.sno=sc.sno

if @icount>=1

begin

raiserror('该学生在表SC中北引用,展示不能被删除!',16,1)

rollback transaction

end

执行:

DELETE

FROM s

WHERE sno='98010'

(3)查看、修改和删除触发器

修改触发器

ALTER trigger [TR_S_Age_update]on[dbo].[s]

for update as

declare @iAge int;

select @iAge=age

from inserted

if @iAge<8 or @iAge>45

begin

raiserror('学生年龄应该大于等于,并小于等于',16,1)

rollback transaction

end

使用系统存储过程查看触发器

sp_depends 'Change_S_Sel'

sp_helptext 'Change_S_Sel'

Exec sp_help 'Change_S_Sel'

删除触发器

10.24

DROP TRIGGER TR_S_Age_update

执行前:

执行后:

(4)

1.

CREATE TRIGGER TR_PAPER_I ON paper

for insert as

declare @ippr money,@ipno char(6)

select @ippr=ppr,@ipno=pno

from inserted

if @ippr<0 or @ippr is NULL

begin

update paper

set ppr=10

where pno=@ipno

end

执行:

INSERT

INTO paper(pno,pna,ppr)

VALUES('000006','江西日报',-9)

2.

CREATE TRIGGER TR_PAPER_D ON paper

for delete

as

declare @ipno char(6)

select @ipno=cp.pno

from deleted,cp

where deleted.pno=cp.pno

begin

delete

from cp

where pno=@ipno

end

执行:

delete

from paper

where pno='000001'

3.

CREATE TRIGGER TR_PAPER_U ON paper

for update

as

declare @ippr money

select @ippr=ppr

from inserted

if @ippr<0 or @ippr is NULL

begin

raiserror('输入单价不正确!',16,1)

rollback transaction

end

执行:

UPDATE paper

SET ppr=-8

WHERE pno='000002'

5.

CREATE TRIGGER safety ON DATABASE

FOR ALTER_TABLE,DROP_TABLE

AS

PRINT'你必须失效DDL触发器"safety"后,才能删除或修改数据库表!'

ROLLBACK;

执行:

DROP TABLE cp

实验总结

通过本次实验,我基本了解掌握了存储过程及触发器的基本操作及相关语法。

  • 下载文档
  • 收藏
  • 0

推荐访问:实验报告 第四次 实验 数据库 数据库第四次实验报告