触发器实验 3

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验(一):MS SQL Server的使用和管理

一、实验目的

①掌握T-SQL语言中几个常用流程控制语句的使用。

②通过对常用系统存储过程的使用,了解存储过程的类型。

③通过创建和执行存储过程,了解存储过程的基本概念,掌握使用存储过程的操作技巧和方法。

二、实验内容

①用两种方法(if…else语句与while、break和continue语句)实现1+2+3……+100值的计算。

②活期存款中,“储户”通过‘存取款单’和“存储所”发生关系。假定储户包括:账号,姓名,电话,地址,存款额;“储蓄所”包括:储蓄所编号,名称,电话,地址。假定一个储户可以在不同的储蓄所存取款,试完成以下设计:

1.创建一个数据库名为SA VE,按要求在SA VE数据库中创建以上的那三个表“储户”、“存取款单”、“储蓄所”。在三张表中自己选择应该在哪些列创建主键外键约束。

2.为“存取款单”表创建一个CHECK约束,使存取标志列的值要么是1要么是0。3.创建一个触发器TR1完成下面的内容:

当向“存取名单”表中插入数据时,如果存取标志=1则应该更正储户表让存款额加上存取金额,如果存取标志=0则应该更正储户表让存款额减去存取金额,如果余额不足则显示余额不足错误。

4.创建一个视图显示用户账号、用户姓名、存款额和所在银行。

5.创建存储过程INPUT_PROC,OUT_PROC分别用于存款和取款,即向存取款单中插入数据。

三、实验步骤

1.启动sql查询分析器,运行相关sql脚本。

2.脚本文件如下:

创建一个数据库名为SA VE:

CREATE DATABASE[SA VE]

ON PRIMARY

(NAME=lfm1_dat,

FILLENAME='c:\SAVE.DA TA.mdf',

SIZE=10,

MAXSIZE=50,

FILEGROWTH=15%)

LOG ON

(NAME='lfm_log',

FILENAME='c:\SAVELOG.ldf',

SIZE=5MB,

MAXSIZE=25MB,

FILEGROWTH=5MB)

创建以上的那三个表“储户”、“存取款单”、“储蓄所”,在三张表中自己选择应该在哪些列创建主键外键约束。

CREATE TABLE 储户

(账号INT PRIMARY KEY,姓名CHAR(10),电话INT,地址CHAR(10),存款额MONEY)

GO

CREATE TABLE 储蓄所

(

储蓄所编号INT PRIMARY KEY,名称CHAR(10),电话INT,地址CHAR(10)

)

GO

CREATE TABLE 存取款单

(

账号INT NOT NULL,储蓄所编号INT NOT NULL,存取日期DA TETIME NOT NULL,存取标志INT NOT NULL,存取金额MONEY

)

GO

为“存取款单”创建主键约束。

ALTER TABLE 存取款单

ADD CONSTRAINT PK

PRIMARY KEY(账号,储蓄所编号,存取日期)

GO

一个储户要存钱,实际上就是向存取款单中插入数据。银行的商业规则规定,一个人必须开了账户才能存取钱,即“储户”表中存在要存取款人的帐号。并且这个人必须到储蓄所去存取钱,即你要插入到“存取款单”表的储蓄所编号列必须在“储蓄所”中存在。

要实现以上商业规则,创建以下两个外键约束。

ALTER TABLE 存取款单

ADD CONSTRAINT FK2

FOREIGN KEY(账号)

REFERENCES 储户(账号)

GO

ALTER TABLE 存取款单

ADD CONSTRAINT FK1

FOREIGN KEY(储蓄所编号)

PEFERENCES 储蓄所(储蓄所编号)

GO

3.为“存取款单”表创建一个CHECK约束,使存取标志列的值要么是1要么是0。ALTER TABLE 存取款单

ADD CONSTRAINT CH

CHECT(存取标志=1 OR 存取标志=0)

GO

4.创建一个触发器TR1完成当向“存取款单”表中插入数据时,如果存取标志=1,则应该更改存储表让存款额加上存取金额,如果存取标志=0则应该更改储户表让存款额减去存取金额,如果余额不足显示余额不足错误。

CREATE TRIGGER TR1

ON 存取款单

FOR INSERT

AS

DECLARE @BZ INT,@MONEY MONEY,@ZH INT

SELECT @BZ=存取标志,@MONEY=存取金额,@ZH=账号

FROM INSERTED

IF @BZ=0

BEGIN

UPDATE 储户

SET 存款额=存款额-@MONEY

WHERE 账号=@ZH

DECLARE @SY MONEY

SELECT @SY=存款额FROM 储户

WHERE 账号=@ZH

IF @sy<0

BEGIN

RAISERROR('余额不足'16,1)

ROLLBACK

END

END

IF @BZ=1

BEGIN

UPDATE 储户

SET 存款额=存款额+@MONEY

WHERE 账号=@ZH

END

5.创建一个视图显示用户账号、用户姓名、存款额和所在银行。

CREATE VIEW V1

AS

SELECT 储户.账号,姓名,存款额,名称AS 储蓄所名称

RROM 储户INNER JOIN 存取款单

ON 储户.账号=存取款单.账号

INNER JOIN 储蓄所

ON 储蓄所.储蓄所编号=存取款单.储蓄所编号

6.创建存储过程INPUT_PROC,OUTPUT_PROC分别用于存款和取款,即向存取款单中插入数据。

CREATE PROC OUT_PROC

@ZH INT,@CXSBH INT,@CCJE MONEY

AS

INSERT 存取款单(账号,储蓄所编号,存取日期,存取标志,存取金额)

V ALUES

(@ZH,@CXSBH,GETDATE(),0,@CCJE)

GO

CREATE PROC INTUT_PROC

@ZH INT,@CXSBH INT,@CCJE MONEY

AS

INSERT 存取款单(账号,储蓄所编号,存取日期,存取标志,存取金额)

V ALUES

相关文档
最新文档