数据库实验五、六(存储过程、游标与触发器)

一、实验五

(1) 建立存储过程,查询在指定银行贷款、且贷款金额高于此银行的平均贷款金额的法人名称、贷款日期和贷款金额。 要求银行名称为输入参数,如果指定的银行不存在,则显示“指定的银行不存

delimiter $$
create procedure highaver(in bank_name varchar(32))
begin
if bank_name in(select bname from bankt) then
select ename 法人名称,Lamount 贷款日期,LSdate 贷款金额
from loadt left join let on loadt.eno=let.eno
left join bankt on loadt.bno=bankt.bno

where bname=bank_name and lamount>
(select avg(lamount) from loadt left join bankt on loadt.bno=bankt.bno where bname=bank_name);

else
	select '指定的银行不存在';
end if;
end $$

call highaver('中国工商银行股份有限公司北京新发地支行')$$

(2) 建立存储过程,查询指定法人的总贷款金额。要求法人名称为输入参数,总贷款金额为输出参
数。
delimiter $$
create procedure Eqamount(in letname varchar(100),out loadamount int)
begin
	if letname in (select ename from let) then
	select sum(lamount) into loadamount
	from loadt left join let on loadt.eno=let.eno
	where ename=letname;
	else
	set letname='北京金开培训学校';  #输入法人不存在则使用默认值
	select sum(lamount) into loadamount
	from loadt left join let on loadt.eno=let.eno
	where ename=letname;
	
	end if;	
end $$
CALL Eqamount('杭州天兔创业投资有限公司',@loadamount);
SELECT @loadamount 贷款金额;

(3) 建立函数,根据银行编号,查询并返回该银行的总贷款金额。并使用 UPDATE 命令,调用该函
数,更新 BankT 表中的贷款总额( Bamount )字段。
delimiter $$
create function BLamount(bankno char(12))
	returns int deterministic
begin
	declare bloadamount int;
	select sum(lamount) into bloadamount
	from loadt
	where loadt.bno=bankno;
	return bloadamount;
end $$
delimiter;

update bankt set bamount=BLamount('103100009138')
where bno='103100009138';

二、实验六

(一)游标

(1) 建立存储过程,查询指定法人的总贷款金额。要求法人代码为输入参数,总贷款金额为输出参
数。
delimiter $$
create procedure Enoamount(in letno char(7),out loadamount int)
begin
	if letno in (select eno from let) then
	select sum(lamount) into loadamount
	from loadt
	where loadt.eno=letno;
	end if;	
end $$
CALL Enoamount('M052014',@loadamount);
SELECT @loadamount 贷款金额;

(2) 编写存储过程实现以下操作,使用游标,访问 LET 表,获取有贷款信息的法人代码,再调用
(1)所建立的存储过程获得该法人的贷款总额,并更新 LET 表中的 Eamount 字段。
delimiter $$
create procedure upletamount()
begin
	declare e char(7);
	declare stop int default 0;
	declare loadeno cursor
	for
	(select let.eno 
	from let,loadt
	where let.eno=loadt.eno);
	declare continue handler for sqlstate '02000' set stop = 1;
	open loadeno;
	fetch loadeno into e;
	while stop<>1 do
	call Enoamount(e,@loadamount);
	update let set Eamount=@loadamount where eno=e;
	fetch loadeno into e;
	end while;
	close loadeno;
end $$

call upletamount();

(二)触发器

(3) LoanT 表创建一个 INSERT 操作上的 AFTER 触发器,当有新的贷款记录插入时,调用(1)所 建立的存储过程,获得该法人的贷款总额,并更新 LET 表中的 Eamount 字段。
(5) 创建一个 INSERT UPDATE 操作上的触发器(根据题目要求自行判断应建立 BEFORE 触发器还 是 AFTER 触发器),为贷款表 (LoanT) 定义规则“法人的总贷款金额不得超过法人注册资金的 10 倍,如果贷款总额达到阈值,则拒绝添加/ 修改数据的请求”。
delimiter $$
create trigger newamount after insert on loadt
FOR each row 
begin
call Enoamount(new.eno,@loadamount);
update let set Eamount=@loadamount where new.eno=eno;
end $$
delimiter;

insert into loadt(eno,bno,lsdate,lamount,lterm,ledate) values('M052024','102100022525','2017-06-03',5,15,null);

(4) LoanT 创建一个 DELETE 操作上的触发器(根据题目要求自行判断应建立 BEFORE 触发器还 是 AFTER 触发器),当删除记录时,调用(1)所建立的存储过程,获得该法人的贷款总额,更 新 LET 表中的 Eamount 字段。
delimiter $$
create trigger delload after delete on loadt
FOR each row 
begin
call Enoamount(old.eno,@loadamount);
update let set Eamount=@loadamount where eno=old.eno;
end $$
delimiter;

Delete from loadt where eno='M052024' and bno='102100022525'; 

(5) 创建一个 INSERT UPDATE 操作上的触发器(根据题目要求自行判断应建立 BEFORE 触发器还 是 AFTER 触发器),为贷款表 (LoanT) 定义规则“法人的总贷款金额不得超过法人注册资金的 10 倍,如果贷款总额达到阈值,则拒绝添加/ 修改数据的请求”。
drop trigger IF EXISTS intrigger; 
drop trigger IF EXISTS uptrigger; 
delimiter $$
create trigger intrigger before insert on loadt
for each row 
begin
if new.eno in (select eno from let where eamount>=ecapital*10) then
signal sqlstate '45000'
set MESSAGE_TEXT = "法人总贷款金额不得超过法人注册资金的10倍。";
end if;
end $$
delimiter;


delimiter $$
create trigger uptrigger before update on loadt
for each row
begin
if old.eno in (select eno from let where eamount>=ecapital*10) then
signal sqlstate '45000'
set MESSAGE_TEXT = "法人总贷款金额不得超过法人注册资金的10倍。";
end if;
end $$
delimiter;

insert into loadt(eno,bno,lsdate,lamount,lterm,ledate) values('M052024','102100022525','2017-02-03',5,15,null);
update loadt set lterm=15 where eno='M052024' and bno='102100020778';

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验5.1 存储过程的建立与使用 一、实验目的 理解存储过程的概念、作用、建立和调用方法。 二、实验原理 使用CREATE PROCEDURE语句创建存储过程,ALTER PROCEDURE语句修改存储过程,DROP PROCEDURE语句删除存储过程存储过程有不带参数的、有带输入参数的、有带输出参数(output)的,还可以有带返回值的。创建好的存储过程可以使用EXEC procedure_name语句执行。 实验5.2 触发器的建立与使用 一、实验目的 理解触发器的概念和作用;了解触发器的分类及触发条件;掌握触发器的定义及应用。 二、实验原理 1、 使用CREATE TRIGGER语句定义触发器,ALTER TRIGGER语句修改触发器,DROP TRIGGER语句删除触发器。 2、 触发器分AFTER/FOR和INSTEAD OF两种类型:AFTER/FOR类型的触发器是在相应的触发语句(insert、delete、update)执行完后被触发的。如果触发语句对应的表上有完整性约束,这些完整性约束必须不违背时,相应的触发语句才能执行,然后才能触发对应的AFTER/FOR类型的触发器。INSTEAD OF类型的触发器会在触发语句(insert、delete、update)执行之前被触发,并取代相应的触发语句。 3、 在表或视图上,每个INSERT、UPDATE或DELETE语句只能创建一个INSTEAD OF类型的触发器,无法为有外键约束且指定为级联删除或级联修改的表创建DELETE或UPDATE语句上的INSTEAD OF 类型的触发器。 SQL SERVER为每个触发器都创建了两个临时表INSERTED表和DELETED表,这两个表的逻辑结构与被触发器作用的表一样,用户可以读取这两个表的内容,但不能对它们进行修改,触发器执行完后,这两个表也会自动删除。当执行INSERT时,INSERTED表中保存要向表中插入的所有行;当执行DELETE时,DELETED表中保存要从表中删除的所有行;当执行UPDATE时,修改前的行保存在DELETED表中,修改后的行保存在INSERTED行中。
数据库角色和权限 2 通过本实验的学习,使学生能够掌握建立SQL Server数据库用户的方法,理解SQL Server的数据库角色病能够进行角色的定义,理解SQL Server的数据库权限,能够分配权限 二、实验内容 1、理解数据库角色和权限 在SQL Server Management Studio中创建三个登录帐户:log1、log2、log3。 利用第3章建立的LoanDB数据库,用log1登录,能否操作LoanDB数据库?为什么? 将log1、log2、log3映射为LoanDB数据库中的用户。 用log1登录,能否操作LoanDB数据库?为什么? 授予log1、log2、log3具有对BankT、LegalEntityT、LoanT三张表的查询权。 分别用log1、log2、log3登录,对上述三张表执行查询。 授予log1具有对BankT表的插入、删除权限。 用log2登录,对BankT表插入一行记录,会出现什么情况? 用log1登录,对BankT表插入一行记录,会出现什么情况? (10)在LoanDB数据库中建立用户角色:role1,并将log1、log2添加到此角色中。 (11)让log2具有LoanDB数据库中的全部数据的查询权,比较好的实现方法是什么? (12)如果拒绝role1查询BankT表,则log1、log2、log3是否有权查询BankT表?为什么? 2、请完成下题 新建一个数据库TGDB,然后在SQL Server中创建“SQL Server身份验证”模式的登录帐号:TG_User,其中账户密码为空,默认数据库为Master。并完成如下操作: 让TG_User成为TGDB数据库的合法用户。 在TGDB数据库中建用户自定义角色:MyRole,让TG_User成为MyRole角色中的成员。 用较好的方法授予MyRole在TGDB数据库中具有所有用户表的查询权。 三、实验报告 将实验结果反映在实验报告中,并对实验中遇到的问题及解决方案、进行整理、分析总结,提出实验结论或自己的看法。 数据库备份和恢复 2 通过本实验的学生,使学生了解SQL Server的数据库备份方法,具备将SQL Server的数据库进行备份和对数据库备份进行数据恢复的能力。 二、实验内容 创建永久性备份设备:backup1,backup2,两个备份设备均存放在默认路径下。 按顺序完成下列备份操作: 将LoanDB数据库完全备份到backup1上; 对LoanDB数据库中的贷款表中的数据进行一些修改,然后将LoanDB数据库差异备份到backup2上; 在贷款表中插入一行新记录,然后将LoanDB数据库差异备份到backup2上; 在贷款表中插入一行新的记录,然后将LoanDB数据库日志备份到backup2上; 在贷款表中删除一行记录,然后对LoanDB数据库日志备份到文件上(d:\file1.bak); 在贷款表中删除一行记录。 对LoanDB数据库进行恢复。恢复顺序是什么样的?如果在恢复之前对数据库进行日志备份,则恢复完成后,第2题第(6)步删除的记录在数据库中存在不?如果在恢复之前不再对数据库进行日志备份,则恢复完成后,第2题第(6)步删除的记录在数据库中存在不? 实验报告 将实验结果反映在实验报告中,并对实验中遇到的问题及解决方案、进行整理、分析总结,提出实验结论或自己的看法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值