银行ATM(SQL脚本)

exec xp_cmdshell 'mkdir d:\bank'            --创建文件目录
use master
go
if exists(select * from sysdatabases where name='ATM')
drop database ATM
go
create database ATM
on
(
name='ATM_data',
filename='d:\bank\ATM_data.mdf',
size=5mb,
filegrowth=15%
)
log on
(
name='ATM_log',
filename='D:\bank\ATM_log.ldf',
size=5mb,
filegrowth=15%
)
--创建用户信息表
use ATM
if exists(select * from sysobjects where name='userInfo')
drop table userInfo
go
create table userInfo
(
customerID int identity (1,1),--自动编号,主键
customerName varchar(20) not null,--开户名
PID varchar(20) not null,--身份证号18位或15位,身份证号唯一约束
telephone varchar(20) not null,--格式固定,或者为11位的手机号
address TEXT --住址,允许为空,可选输入
)
go
--给表userInfo添加约束
alter table userInfo
add constraint uq_PID   unique(PID)    --身份证号的唯一约束
alter table userInfo
add constraint ck_PID check(len(PID)=18 or len(PID)=15)
alter table userInfo
add constraint pk_customerID primary key(customerID)   --主键约束
alter table userInfo
add constraint ck_telephon check(telephone like '[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'or telephone like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')    --电话号码的格式约束 
go
--插入测试数据
insert into userInfo values('张三','123456789012345','0010-67898978','北京海淀')
insert into userInfo values('李四','321245678912345678','0478-44443333',default)

--创建表cardInfo
if exists(select * from sysobjects where name='cardInfo')
drop table cardInfo
create table cardInfo
(
cardID varchar(50) not null,   --卡号,主键,前八位号固定,每四位有一空格,卡号随机产生
curType varchar(20) not null,-- ,默认值为RMB
savingTypr varchar(20),--存款类型
openDate datetime not null,--开户日期
openMoney money not null,--不低于一元
balance money not null,--不低于一元,否者将销户 
pass varchar(10) not null,--6位数字,开户时默认为6个8
IsReportLoss bit not null,--是否挂失,,默认为否
customerID int not null,--外键一位顾客可以办理多张卡
)
go
--给表cardInfo添加约束
alter table cardInfo
add constraint pk_carID unique(cardID)   --卡号的唯一约束
alter table cardInfo
add constraint df_curType default('RMB') for curType --货币类型默认为人民币
alter table cardInfo
add constraint df_openDate default(getDate()) for openDate   --默认为系统当前日期
alter table cardInfo
add constraint ck_openMoney check(openMoney>=1) --添加CHECK约束,约束开户金额不能小于1元
alter table cardInfo
add constraint ck_balance check(balance>=1) --给帐户余额添加CHECK约束,>=1
alter table cardInfo
add constraint df_pass default(888888) for pass   --密码默认为6个8
alter table cardInfo
add constraint df_IsReportLoss default('0') for IsReportLoss
alter table cardInfo
add constraint ck_cardID check(cardID like '[0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')         --卡号格式验证
alter table cardInfo
add constraint fk_customerID foreign key (customerID) references userInfo (customerID)   --顾客编号的外键约束
go 
--给银行信息表插入测试数据
insert into cardInfo values('1010 3576 1212 1134',default,'定期',default,1.0000,1.0000,default,default,2)
insert into cardInfo values('1010 3576 1234 5678',default,'活期',default,1000.000,1000.000,default,default,1)
go
--创建交易信息表
if exists(select * from sysobjects where name='transInfo')
drop table transInfo
create table transInfo
(
transDate datetime not null,        --交易日期,默认为系统当前日期
cardID varchar(50) not null,         --外键,可重复索引
transType varchar(20) not null,        --只能是存入\支出
transMoney money not null,           --大于0
remark text ,         --备注,选填  
)
--给表transInfo添加约束
alter table transInfo
add constraint df_transDate default(getDate()) for transDate         --交易日期默认系统当前日期
, constraint fk_cardID foreign key (cardID) references cardInfo(cardID)       --卡号的外键约束
, constraint ck_transType check(transType like '存入'or transType like '支取')         --交易类型约束
, constraint ck_transMoney check(transMoney>0)
go
--交易信息表插入测试数据
insert into transInfo (transType,cardID,transMoney)values('支取','1010 3576 1234 5678',900)
insert into transInfo (transType,cardID,transMoney)values('存入','1010 3576 1212 1134',5000)

-----------------------常规业务模拟
--修改密码
update cardInfo set pass='123456' where cardInfo.customerID=(select userInfo.customerID from userInfo where customerName='张三')
update cardInfo set pass='123123' where customerID=(select customerID from userInfo where customerName='李四')

--------帐号挂失
update cardInfo set IsReportLoss='1' where cardID='1010 3576 1212 1134'

----------统计银行的资金流通金额和赢利结算
declare @inMoney money,@outMoney money                                     --定义两个变量存放总支取和总存入
select @inMoney=sum(transMoney) from transInfo where transType='存入'
select @outMoney=sum(transMoney) from transInfo where transType='支取'
print '银行流通余额总计为:'+convert(varchar(20),@inMoney-@outMoney)+'RMB'
print '银行的总赢利金额为:'+convert(varchar(20),@outMoney*0.008-@inMoney*0.003)+'RMB'

--查询本周开户的卡号,显示该卡相关信息
declare @time datetime
select @time=openDate from cardInfo
select * from cardInfo where datediff(day,getDate(),@time)<=7

------------查询本月交易金额交易最高的卡号
select cardID from transInfo where transMoney in(select max(transMoney) from transInfo )

-----------查询挂失帐号的客户信息
select customerName as 客户姓名,PID as 客户身份证号,telephone as 电话,address as 住址 from userInfo where customerID=(select customerID from cardInfo where IsReportLoss='1')

------------催款提醒业务
select customerName as 客户姓名,telephone as 联系电话,balance as 帐上余额 from userInfo INNer join cardInfo on cardInfo.customerID=userInfo.customerID where balance<200


---------------------------------------创建表的视图
--给表userInfo创建视图和给cardID字段创建重复索引,填充
use ATM
go
if exists(select * from sysobjects where name='view_userInfo')
drop view view_userInfo
go
create view view_userInfo
as
select 顾客编号=customerID,顾客姓名=customerName,身份证号=PID,联系电话=telephone,居住地址=address from userInfo
go


------------创建视图
go
if exists(select * from sysobjects where name='view_cardInfo')
drop view view_cardInfo
go
create view view_cardInfo
as
select 卡号=cardID,货币种类=curType,存款类型=savingTypr,开户日期=openDate,开户金额=openMoney,帐户余额=balance,密码=pass,是否挂失=IsReportLoss,顾客编号=customerID from cardInfo
go


-----创建视图
go
if exists(select * from sysobjects where name='view_Info')
drop view view_Info
go
create view view_Info
as
select 交易日期=transDate,卡号=cardID,交易类型=transType,交易金额=transMoney,备注=remark from transInfo
go


------------使用视图
select * from view_userInfo
--------------------使用视图
select * from view_cardInfo

-----------------使用视图
select * from view_Info


------------------给cardID字段创建索引
use ATM
go
if exists(select name from sysindexes where name='IX_cardInfo_cardID')
drop index cardInfo.IX_cardInfo_cardID                   --删除索引
go
create nonclustered index IX_cardInfo_cardID                          --创建索引
on transInfo(cardID)
with fillfactor=70
go


-------------按指定索引查询
select * from transInfo (index=IX_cardInfo_cardID) where cardID='1010 3576 1212 1134'


-------------------------------------------创建触发器

use ATM
go
if exists(select * from sysobjects where name='trig_trans')              --检查触发器是否存在,存在删除,不存在添加
drop trigger trig_trans                            --删除触发器
go
create trigger trig_trans                          --添加触发器
on transInfo 
for insert 
as 
declare @IsReportLoss bit
declare @transtype varchar(4),@cardID varchar(20), @transMoney money                 --定义变量并赋值
declare @balance money 
select @transtype=transType,@cardID=cardID,@transMoney=transMoney from inserted
select @balance=balance from cardInfo where cardID=@cardID 

select @IsReportLoss=IsReportLoss from cardInfo where cardID=@cardID
if(@IsReportLoss='0')                             --验证卡号是否已经挂失,如果没有挂失才能进行操作,如过挂失则不能进行操作
begin
if(@transtype='支取')
begin 
if (@balance-@transMoney)>=1
begin
update cardInfo set balance=balance-@transMoney where cardID=@cardID
select @balance=balance from cardInfo where cardID=@cardID
print'交易成功!交易金额'+convert(varchar(10),@transMoney)
print'卡号'+@cardID+' '+'余额'+convert(varchar(10),@balance)
end
else
begin
raiserror('交易失败!金额不足',16,1)
select @balance=balance from cardInfo where cardID=@cardID
print'卡号'+@cardID+' '+'余额'+convert(varchar(10),@balance)
rollback transaction
end
       end
else
begin
update cardInfo set balance=balance+@transMoney where cardID=@cardID
select @balance=balance from cardInfo where cardID=@cardID
print'交易成功,交易金额'+convert(varchar(10),@transMoney)
print'卡号'+@cardID+' '+'余额'+convert(varchar(10),@balance)
end
end
else                         --挂失的卡执行下面的提示语言,并返回
begin
print '交易失败,该卡号已经挂失,请先拿您的有效证件解锁!'
return
end
go

-------------------------------------------测试触发器
use ATM
declare @card char(20)
select @card=cardID from cardInfo   where customerID=(select customerID from userInfo where customername='张三')
insert into transInfo(cardID,transtype,transMoney) values(@card,'支取',200)
go
use ATM
declare @card char(20)
select @card=cardID from cardInfo   where customerID=(select customerID from userInfo where customername='李四')
insert into transInfo(cardID,transtype,transMoney) values(@card,'存入',2000)
go


---------------------创建存储过程
use ATM
go
if exists(select * from sysobjects where name='proc_takeMoney')
drop procedure proc_takeMoney
go
create procedure proc_takeMoney
@cardID varchar(20),
@transMoney money,
@transType varchar(20),
@pass varchar(10)=''
as 
if(@transType='支取')
begin
if(select pass from cardInfo where cardID=@cardID)=@pass                  --验证密码是否正确,正确的才可以进行下面的操作
begin
insert into transInfo(cardID,transType,transMoney)values(@cardID,@transType,@transMoney)
end
else                           --密码不正确的执行下面的提示语句,并且返回
begin
raiserror('密码不正确!',16,1)
return
end
end
else
begin
insert into transInfo(cardID,transType,transMoney)values(@cardID,@transType,@transMoney)
end
---------------------------用存储过程验证张三的支取
go      
declare @card char(20)
select @card=cardID from cardInfo   where customerID=(select customerID from userInfo where customername='张三')
exec proc_takeMoney @card,300,'支取','123456'
-------------------------调用存储过程验证李四的存入
go      
declare @card char(20)
select @card=cardID from cardInfo   where customerID=(select customerID from userInfo where customername='李四')
exec proc_takeMoney @card,30,'存入','123123'

----------------------------创建随即卡号的存储过程
use ATM
if exists(select * from sysobjects where name='proc_randCardID')
drop procedure proc_randCardID
go
create procedure proc_randCardID @randCardID char(19) output
as
declare @r numeric(15,8)                --15位数,保留8位小数
select @r=rand(datepart(mm,getdate())*1000000)+(datepart(ss,getdate())*1000)+datepart(ms,getdate())
set @randCardID=substring(convert(varchar(15),@r),1,4)+' '+substring(convert(varchar(15),@r),7,4)
go

-----------------------------------查看产生的随即卡号
declare @myCardID char(19)
exec proc_randCardID @myCardID output
print   '产生的随即卡号为: '+'1010 3576'+' '+@myCardID
go


-----------------------------------------创建开户的存储过程
use ATM
if exists(select * from sysobjects where name='proc_openAccount')
drop procedure proc_openAccount
go
create procedure proc_openAccount @customerName char(8),@PID char(18),@telephone char(13), @openMoney money,@savingType char(8),@address varchar(80)=''
as
declare @sum varchar(50),@cardID varchar(50)
declare @cur_customerID int
exec proc_randCardID @sum output
set @cardID='1010 3576'+' '+@sum
if exists(select * from cardInfo where cardID=@sum)                   --验证是否已经存在的卡号
begin
return
end
else
begin
insert into userInfo(customerName,PID,telephone,address) values(@customerName,@PID,@telephone,@address)
select @cur_customerID=customerID from userInfo where PID=@PID
insert into cardInfo (cardID,savingTypr,openMoney,balance,customerID) values(@cardID,@savingType,@openMoney,@openMoney,@cur_customerID)
end
go

------------------------------------------------调用存储过程开户
exec proc_openAccount 'lkjkfgfdgfdfgldf','123456789112345633','12365498752',3000,'定期','山东青岛'


-----------------------测试开户的存储过程
select * from userInfo
select * from cardInfo

-------------------------------------创建转帐的事务
if exists(select * from sysobjects where name='proc_transfer')
drop procedure proc_transfer
go
create procedure proc_transfer @card1 char(20),@card2 char(20),@outMoney money
as
declare @error int
set @error=0
begin tran
exec proc_takeMoney @card1,@outMoney,'支取','123123'               --调用存储过程
set @error=@error+@@error
exec proc_takeMoney @card2,@outMoney,'存入','123456'               --调用存储过程
set @error=@error+@@error
if(@error<>0)
begin
print'转帐失败'
rollback tran
end
else
begin
print'转帐成功'
commit tran
end
go


---------------------------测试转帐事务是否成功
exec proc_transfer '1010 3576 1212 1134','1010 3576 1234 5678',1000



--------------------------------------------创建登录帐号和数据库用户
go
exec sp_addlogin 'sysAdmin','1234'           -------添加sql登录帐号
exec sp_grantdbaccess 'sysAdmin','sysAdminDBUser'           --创建数据库用户

----------给用户授权
grant select,insert,update,delete on userInfo to sysAdmin
grant select,insert,update,delete on userInfo to sysAdminDBUser
grant select,insert,update,delete on cardInfo to sysAdmin
grant select,insert,update,delete on cardInfo to sysAdminDBUser
grant select,insert,update,delete on transInfo to sysAdmin
grant select,insert,update,delete on transInfo to sysAdminDBUser

转载于:https://www.cnblogs.com/123clb/articles/1140311.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值