ACCP4.0项目实战源码之SQL ATM

/* 作者:花满天
   QQ:122273014
   
*/


-- 1 建库
  -- 1.1 在D盘创建bank文件夹
  use  master
 
exec  xp_cmdshell  ' mkdir d:ank ' ,NO_OUTPUT 
go
 
 
--  1.2 检测是否存在bankDB 
 
   
if   exists ( select   *   from  sysdatabases  where  name = ' bankDB '  )
    
begin
      
drop   database  bankDB
    
end
 
go
 
-- 1.3 建bankDB
  create   database  bankDB    --  数据库的逻辑名称
on   primary              -- 默认的组(可不写)
(
 name
= ' bankDB ' ,           
 filename
= ' d:ankankDB.mdf ' -- 数据库的物理文件
 size = 5 ,
 maxsize
= 100 ,
 filegrowth
= 15 %
)
log   on                            -- 数据库的日志文件
(
 name
= ' bankDB_log ' ,
 filename
= ' d:ankankDB.ldf ' ,
 size
= 2 ,
 filegrowth
= 1
 
)
GO
-- 2 建表加约束 
  use  bankDB 

-- (因数据库是肯定是刚创好的,所以可以不写 drop table userInfo)
   -- 2.1 create table userInfo
    create   table  userInfo
 (
  customerID   
int              identity ( 1 , 1 primary   key  ,
  customerName 
varchar ( 20 )     not   null ,
  PID          
varchar ( 18 )     not   null    unique   check  ( len (PID) = 18    or   len (PID) = 15 ),
  telephone    
varchar ( 20 )     not   null    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   len (telephone) = 11 ),
  address      
varchar ( 50 )     null
 )
 
go   

 
--  2.2 create table cardInfo
   create   table  cardInfo
  (
   cardID     
varchar ( 20 )    primary   key   check ( cardId  like   ' 1010 3576 [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] ' ),
   curType    
varchar ( 10 )     not   null   default ( ' RMB ' ),
   savingType 
varchar ( 10 )    check  (savingType  in ( ' 活期 ' , ' 定活两便 ' , ' 定期 ' )),
   openDate    
datetime       not   null   default  ( getdate ()),
   openMoney   
money          not   null   check  (openMoney >= 1 ),
   balance     
money          not   null   check  (balance >= 1 ),
   pass 
char ( 6 not   null      default   ' 888888 '   check len (pass) = 6 ),
   IsReportLoss 
varchar ( 2 )   default   ' '   check (IsReportLoss  in ( ' ' , ' ' )),
   customerID    
int          foreign   key   references  userInfo(customerID)
  )
go
 
--  2.3 create table transDate
  create   table  transInfo
(
   transDate   
datetime       not   null   default ( getdate ()),
   cardID      
varchar ( 20 )   not   null   foreign   key   references  cardInfo(cardID),
   transType   
char ( 4 )       check (transType  in  ( ' 存入 ' , ' 支取 ' )),
   transMoney  
money          not   null   check (transMoney  > 0 ),
   remark      
varchar ( 40 )
)

go
-- 3 写入测试数据 (人工)


  
-- 3.1 insert into UserInfo
insert   into  userInfo(customerName,PID,telephone,address)  values ( ' 张三 ' , ' 123456789012345 ' , ' 0010-67898978 ' , ' 北京海淀 ' )
insert   into  userInfo(customerName,PID,telephone)          values ( ' 李四 ' , ' 321245678912345678 ' , ' 0478-44443333 ' )
go
  
-- 3.2 insert into cardInfo
insert   into  cardInfo(cardID,curType,savingType,openDate,openMoney,balance,customerID)  values ( ' 1010 3576 1212 1134 ' , default , ' 定期 ' , default , 1 , 1 , 2 )
insert   into  cardInfo(cardID,curType,savingType,openDate,openMoney,balance,customerID)  values ( ' 1010 3576 1234 5678 ' , default , ' 活期 ' , default , 1000 , 1000 , 1 )
go
  
-- 3.3 insert into transInfo
insert   into  transInfo(transDate,transType,cardID,transMoney) values ( getDate (), ' 支取 ' , ' 1010 3576 1212 1134 ' , 900 )
insert   into  transInfo(transDate,transType,cardID,transMoney) values ( getDate (), ' 存入 ' , ' 1010 3576 1234 5678 ' , 5000 )
go
-- 显示
select   *   from  userInfo
select   *   from  cardInfo
go

-- 4 常规业务模似
   -- 4.1 修改用户密码
  update  cardinfo  set  pass = ' 123456 '   where  cardID = ' 1010 3576 1234 5678 '   --  张三
  update  cardinfo  set  pass = ' 123123 '   where  cardID = ' 1010 3576 1212 1134 '   --  李四
select   *   from  cardInfo
go   
 
-- 4.2 挂失账号
  update  cardinfo  set  IsReportLoss = ' '   where  cardID = ' 1010 3576 1212 1134 '   --  李四
select   *   from  cardInfo  where  cardID = ' 1010 3576 1212 1134 '
go
 
-- 4.3 资金流通余额和盈利结算
  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 '
go
 
-- 4.4 查询本周开户的Card
  select   *   from  cardInfo  where   DATEDIFF  (ww,OpenDate, getDate ()) = 0
 
-- 4.4 查询本月交易最高的卡号
   select   top   1  cardId, sum (transmoney)  as  交易总金额  from  transinfo
  
where   datediff (mm, getDate (),transdate) = 0
  
group   by  cardId 
  
order   by   sum (transmoney)  desc

 
-- 4.5 挂失
    select  customername  as  客户姓名,telephone  as  联系电话  from  userinfo u  inner   join  cardinfo c  on  u.customerid = c.customerid  where  isreportloss = ' '  

 
-- 4.6  提醒业务
   select  customername  as  客户姓名,telephone  as  联系电话,balance  as  卡上余额
  
from  userinfo u  inner   join  cardinfo c  on  u.customerid = c.customerid
  
where  balance <= 200

-- 5 创建索引和视图
--
5.1 创建索引

  
CREATE   INDEX  index_card
     
ON  transinfo (cardid)
   
WITH   FILLFACTOR   =   70
go

  
select   *   from  transinfo  where  cardid = ' 1010 3576 1212 1134 '  
go
-- 5.2创建视图
   -- 5.21 v_userinfo
   create   view  v_userinfo
  
as
  
select  customerID  as  客户编号,customername  as  开户名,pid  as  身份证号,telephone  as  电话号码,address  as  居住地址  from  userinfo
go
  
select   *   from  v_userinfo
go
 
-- 5.22 v_cardinfo
   create   view  v_cardinfo
   
as
  
select  cardid  as  卡号,curtype  as  货币种类,savingtype  as  存款类型,opendate  as  开户日期,balance  as  余额,pass  as  密码,isreportloss  as  是否挂失,customerid  as  客户编号  from  cardinfo
go
  
select   *   from  v_cardinfo
go
 
-- 5.23  v_transInfo
  create   view  v_transInfo
    
as
   
select  transdate  as  交易日期,transtype  as  交易类型,cardid  as  卡号,transmoney  as  交易金额,remark  as  备注  from  transInfo
go  
   
select   *   from  v_transInfo
go

-- 6 创建触发器
   IF   EXISTS  ( SELECT  name  FROM  sysobjects  WHERE  name  =   ' trig_trans '  )
     
DROP   TRIGGER  trig_trans
GO

  
create   trigger  trig_trans 
      
on  transInfo 
       
for   insert
     
as
  
declare   @myTransType   char ( 4 ), @outMoney   money , @myCardID   varchar ( 30 ), @zhi_balance   money
  
select   @myTransType = transType, @outMoney = transMoney, @myCardID = cardID  from  inserted
        
if ( @myTranstype = ' 存入 ' )
         
begin
                     
update  cardinfo  set  balance  = balance + @outMoney   where  cardid = @mycardid
                     
print   ' 交易成功,存入 ' + convert ( varchar ( 15 ), @outMoney ) + ' RMB '
                 
end
        
else
             
begin
         
select   @zhi_balance = balance - @outMoney   from  cardinfo  where  cardid = @mycardid
          
if ( @zhi_balance <= 0 )
                   
begin
                      
raiserror ( ' 余额不足! ' , 16 , 1 )
                      
rollback   tran
                   
end
              
else
         
begin
                     
update  cardinfo  set  balance  = balance - @outMoney   where  cardid = @mycardid
                     
print   ' 交易成功,支取 ' + convert ( varchar ( 15 ), @outMoney ) + ' RMB '
                 
end
             
end

--
go

-- 7:测试触发器
--
 7.1.1 Error
   insert   into  transInfo(transDate,transType,cardID,transMoney) values ( getDate (), ' 支取 ' , ' 1010 3576 1234 5678 ' , 1000 )
go
--  7.1.2 NotError
   insert   into  transInfo(transDate,transType,cardID,transMoney) values ( ' 2005-9-1 ' , ' 存入 ' , ' 1010 3576 1212 1134 ' , 200 )
go


-- 8:创建存储过程

IF   EXISTS  ( SELECT  name  FROM  sysobjects 
         
WHERE  name  =   ' proc_takeMoney '   AND  type  =   ' P ' )
   
DROP   PROCEDURE  proc_takeMoney
GO

create   proc  proc_takeMoney
    
@card   char ( 19 ), @m   money , @type   char ( 4 ), @inputpass   char ( 6 ) = ''
as
if   exists ( select   *   from  cardinfo  where  cardid = @card   and  pass = @inputpass )
   
begin
      
if ( @type = ' 支取 ' )
        
begin
           
insert   into  transInfo(transType,cardID,transMoney) values ( ' 支取 ' , @card , @m )
           
print   ' 成功支取 ' + convert ( varchar ( 12 ), @m ) + ' RMB '
        
end
        
      
else
        
begin
           
insert   into  transInfo(transType,cardID,transMoney) values ( ' 存入 ' , @card , @m )
           
print   ' 成功存入 ' + convert ( varchar ( 12 ), @m ) + ' RMB '
        
end
   
end
else
    
begin
      
-- rollback tran
       print   ' 密码错误 '
    
end
go
exec  proc_takeMoney  ' 1010 3576 1234 5678 ' , 300 , ' 支取 ' , ' 34323 '   -- 密码错误
exec  proc_takeMoney  ' 1010 3576 1234 5678 ' , 300 , ' 支取 ' , ' 888888 '
go


-- 9:产生随机卡号存储过程
  IF   EXISTS  ( SELECT  name  FROM  sysobjects  WHERE  name  =   ' proc_randCardID '
   
DROP   PROCEDURE  proc_randCardID
  
GO

  
create   proc  proc_randCardID 
     
@randCardID   char ( 19 ) output
   
as
    
declare   @r   char ( 15 ),
            
@index   int ,
            
@tempStr   char ( 9 )


     
-- 产生随机数
    select   @r = convert (numeric( 15 , 8 ), datepart (ms, getdate ()) * rand ()) 
   
select   @index = charindex ( ' . ' , @r )
   
select   @tempStr = substring ( @r , @index + 1 , 4 ) + '   ' + substring ( @r , @index + 5 , 4 )   -- 获得后面8位随机数
  
    
-- 随机卡号
    set   @randCardID   = ' 1010 3576 ' + '   ' + @tempStr

go
-- ----

--  测试随机号
declare   @randcardID   char ( 19 )
exec  proc_randCardID  @randcardID  output
print   ' 产生的卡号为: ' + @randcardID


-- 10 ;开户开户存储过程
  IF   EXISTS  ( SELECT  name  FROM  sysobjects  WHERE  name  =   ' proc_openAccount ' )
     
DROP   PROCEDURE  proc_openAccount
GO

  
create   proc  proc_openAccount
    
@customername   varchar ( 20 ), @pid   char ( 20 ), @telephone   char ( 13 ), @openMoney   money , @savingType   char ( 8 ),
    
@address   varchar ( 50 ) = ''
 
as  
   
declare   @mycardID   char ( 19 ),
           
@cur_customerID   int

 
execute  proc_randCardID  @mycardID  output  --  得到我的随机号 
  
  
while   exists ( select   *   from  cardinfo  where  cardid = @mycardid -- 如果随在,在随机一次
      execute  proc_randCardID  @mycardID  output

  
insert   into  userinfo(customerName,PID,telephone,address) values ( @customername , @pid , @telephone , @address ) -- 写入数据userinfo

  
select   @cur_customerID = customerID  from  userinfo  where  pid = @pid   -- 得到当前的ID号

  
insert   into  cardinfo(cardid,savingtype,openmoney,balance,customerid)   values  ( @mycardid , @savingtype , @openMoney , @openMoney , @cur_customerID ) -- 写入cardinfo
    print   ' 尊敬的客户,开户成功!您的卡号为: ' + @mycardid + ' 开户金额: ' + convert ( varchar ( 12 ), @openMoney ) + ' 开户日期: ' + convert ( varchar ( 10 ), getdate ())
go

-- 测验10
exec  proc_openAccount  ' 王五 ' , ' 334456889012678 ' , ' 2222-63598978 ' , 1000 , ' 活期 ' , ' 河南新乡 '
exec  proc_openAccount  ' 赵二 ' , ' 213345678912342222 ' , ' 0760-44446666 ' , 1 , ' 定期 '

-- 11创建事务
go
 
create   proc  proc_transfer  
    
@card1   char ( 19 ), 
    
@card2   char ( 19 ),
    
@outmoney   money
 
as
 
begin   tran
  
declare    @ErrorSum   int
  
set   @ErrorSum = 0
 
insert   into  transinfo(transtype,cardid,transmoney)  values ( ' 支取 ' , @card1 , @outmoney )
  
set   @ErrorSum =   @ErrorSum + @@ERROR
 
insert   into  transinfo(transtype,cardid,transmoney)  values ( ' 存入 ' , @card2 , @outmoney )
  
set   @ErrorSum =   @ErrorSum + @@ERROR
 
if @ErrorSum <> 0 )
   
rollback   tran
 
else
   
commit   tran
-- 测试
go
declare   @card_1   char ( 19 ), @card_2   char ( 19 )
  
select   @card_1 = cardid  from  cardinfo c  inner   join  userinfo u  on
  c.customerid
= u.customerid  where  customername = ' 李四 '

   
select   @card_2 = cardid  from  cardinfo c  inner   join  userinfo u  on
   c.customerid
= u.customerid  where  customername = ' 张三 '
   
exec  proc_transfer  @card_1 , @card_2 , 200
  
select   *   from  v_cardinfo
  
select   *   from  v_transinfo
go


-- 12 创建账号和数据用户服务
exec  sp_addlogin  ' sysAdmin ' , ' 1234 ' -- SQL 登陆帐号

exec  sp_grantdbaccess  ' sysAdmin ' , ' sysAdminDBUser ' -- 创建数据库用户

grant   select , insert , update , delete   on  transinfo  to  sysAdminDBUser  -- 给权力

/* 作者:花满天
   QQ:122273014
   如有更好的编写方法,请和我联系
*/
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值