机房收费系统数据库设计(二)

概述

数据库的设计老早就开始了,但是,今天才完成,我有点受不了,但也可以接收,因为集中在数据库设计的时间很少,接下的日子里,要开始UML画图阶段了,在这个阶段同样也是那样,重新的整体的来一遍,运用上三层的知识。下面说说数据库设计这方面的事情。

       数据库设计是一个反复的过程,在这个阶段了,光推到之前建好的静态数据库就有2次,小范围的修改就更是不用提,我相信在和应用程序连接的时候,还回有修改。

       自己设计的数据库运用了一些基本的技术,实现了数据无删除,真删除无知觉的功能,在设计的过程中遇到了一个误区,就是把最终应用程序和数据库管理程序的混淆了。最终的应用程序一方面受控于数据库管理程序的用户级别,另一方面受控于应用程序本身,而数据库管理程序只受控于用户级别。数据库的设计阶段要感谢李保强师哥和熊青峰师哥的帮助。下面是数据库运用到的一些技术。

触发器

        触发器的类型为Instead of中的Delete,由于数据库中有很多的外键约束关系,这样删除数据库的记录时,还需要知道数据库的中表和表之间的额关系,为了解决这个问题,创建这些触发器,通过级联和游标这些手段实现数据库管理系统的用户真删除数据简单化的功能。

       TI_Operator_Info触发器,操作者删除操作者的前一时刻触发。

USE [Charge]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

if exists(select * from dbo.sysobjects where id=OBJECT_ID(N'[dbo].[TI_Operator_Info]') and OBJECTPROPERTY(id, N'IsTrigger')=1)
drop trigger TI_Operator_Info
go

create trigger TI_Operator_Info on Operator_Info
instead of delete
as
   declare @Operator_ID char(20)
   declare @Operator_Login_ID int
begin
   --获得要删除的操作者的ID
   select @Operator_ID=Operator_ID  from deleted 
   
   --申明一个游标
   Declare Cur Cursor For 
   select Operator_Login_ID from Operator_Login_Record where Operator_ID=@Operator_ID
   
   --打开游标
   open Cur
   
   --使用游标
   fetch next from Cur into @Operator_Login_ID
   --删除该操作者的所有上机记录信息
   while @@FETCH_STATUS =0
         begin
              delete from Operator_Login_Record where Operator_ID =@Operator_Login_ID 
              fetch next from Cur into @Operator_Login_ID
         end
   
   --再删除操作者的信息
   delete from Operator_Info where Operator_ID=@Operator_ID 
end

注意:由于一个用户ID可能对应多条上机记录,要想全部的删除这些上机记录,需要使用游标,一个一个的删除;由于在这里只贴了一个触发器,看不出级联删除的意思,在这里叙述一些,要想真删除某一个操作者用户,必须先删除它的上机记录信息,要想删除他的上机记录信息,必须先删除它上机时的操作信息。


存储过程

       存储过程主要是为了最终的应用程序所使用,操作者的一些操作,都有相应的信息记录,所以,建立了相应的存储过程来实现目的

       Proc_AddOperator存储过程,操作者添加操作者时调用的一些T-SQL语句

--判断是否存在相同名称的存储过程
if (OBJECT_ID('Proc_AddOperator', 'P') is not null)
drop proc Proc_AddOperator
go

--创建存储过程
create proc Proc_AddOperator
(
    --操作者本次上机记录号
    @Operator_Login_ID int,
    --被操作者信息
    @Operator_ID varchar(20),
    @Operator_Key varchar(20),
    @Operator_Name varchar(20),
    @Operator_Sex varchar(20),
    @Operator_Level varchar(20)
)
as
    begin 
         --不返回受T-SQL语句影响的行数
         set nocount on
         --当事务中的语句出错时,事务回滚到事务的开始的那一状态
         set xact_abort on
         
         begin transaction --开始事务
         --先向注册记录表中写入数据,然后才可以向操作者信息表中写入数据
         --Operator_Register_ID为自增性
         insert into Operator_Register_Record(Operator_Login_ID ,Operator_User_ID ,Operator_Register_Date ,Operator_Register_Time ) 
         values(@Operator_Login_ID,@Operator_ID,CONVERT(varchar(10),GETDATE(),120),CONVERT(varchar(8),getdate(),108))
         
         --向Operator_Info表中写入数据
         insert into Operator_Info(Operator_ID ,Operator_Key ,Operator_Level ,Operator_Name ,Operator_Sex ,Operator_State )
         values(@Operator_ID ,@Operator_Key ,@Operator_Level ,@Operator_Name ,@Operator_Sex ,'离线')         
         
         commit tran
    end
go


       Proc_DaySum触发器用于汇总今天的总情况
描述:Proc_DaySum存储过程用于向DaySum中插入数据
if(OBJECT_ID('Proc_DaySum','P') is not null)
drop proc Proc_DaySum
go

create proc Proc_DaySum
(
    --操作者上机记录ID
    @Operator_Login_ID int
)
as
    declare @DaySum_Date date
    declare @DaySum_LoginNO int
    declare @DaySum_RegisterNO int
    declare @DaySum_ReturnNO int
    declare @DaySum_ReturnMoney real
    declare @DaySum_RechargeNO int
    declare @DaySum_RechargeMoney real
    declare @DaySum_MakeMoney real
    begin
         --获得今日的日期
         set @DaySum_Date =CONVERT(varchar(10),GETDATE(),120)
         --获得今日上机的总人数
         select @DaySum_LoginNO =SUM(User_Login_ID) from User_Login_Record where User_Login_Date =@DaySum_Date 
         --获得今日注册总人数
         select @DaySum_RegisterNO =SUM(User_Register_ID) from User_Register_Record where User_Register_Date=@DaySum_Date 
         --获得今日退卡总人数
         select @DaySum_ReturnNO =SUM(Card_Return_ID) from Card_Return_Record where Card_Return_Date =@DaySum_Date 
         --获得今日退卡总金额
         select @DaySum_ReturnMoney =SUM(Card_Return_Money) from Card_Return_Record where Card_Return_Date =@DaySum_Date
         --获得今日充值人数
         select @DaySum_RechargeNO =SUM(Card_Recharge_ID) from Card_Recharge_Record where Card_Recharge_Date =@DaySum_Date 
         --获得今日充值金额
         select @DaySum_RechargeMoney =SUM(Card_Recharge_Money) from Card_Recharge_Record where Card_Recharge_Date=@DaySum_Date
         --获得今日获利金额
         select @DaySum_MakeMoney =SUM(User_Cost) from User_Login_Record ,Bill where User_Login_Date =@DaySum_Date and Bill.Bill_ID =User_Login_Record .Bill_ID 
         
         --向DaySum中插入数据
         if exists(select * from DaySum where DaySum_Date =@DaySum_Date )
         delete from DaySum where DaySum_Date =@DaySum_Date 
         insert into DaySum(DaySum_Date ,Operator_Login_ID ,DaySum_LoginNO ,DaySum_RegisterNO ,DaySum_ReturnNO ,DaySum_ReChargeNo ,DaySum_ReturnMoney ,DaySum_RechargeMoney ,DaySum_MakeMoney)
         values(@DaySum_Date ,@Operator_Login_ID ,@DaySum_LoginNO ,@DaySum_RegisterNO ,@DaySum_ReturnNO ,@DaySum_RechargeNO ,@DaySum_ReturnMoney ,@DaySum_RechargeMoney ,@DaySum_MakeMoney )
         
     end
go

视图

       从DaySum表中得出总的汇总       

if exists(select TABLE_NAME from INFORMATION_SCHEMA .VIEWS where TABLE_NAME =N'View_SumAll')
drop view View_SumAll
go

create view View_SumAll(Sum_LoginNO,Sum_RegisterNO,Sum_ReturnNO,Sum_ReChargeNO,Sum_ReturnMoney,Sum_ReChargeMoney,Sum_MakeMoney)
as
Select SUM(DaySum_LoginNO),SUM(DaySum_RegisterNO),SUM(DaySum_ReturnNO),SUM(DaySum_ReChargeNO),SUM(DaySum_ReturnMoney),SUM(DaySum_ReChargeMoney),SUM(DaySum_MakeMoney) from DaySum
       注意:视图的建立主要是为了一个总的汇总需要而建立。

总结

       现阶段触发器和存储过程建立一些,有十几个,但只贴出一个,有兴趣的同学可以给我留言,我再给你。总得来说这篇博客不是很成功,想要说的东西很多,可是写的很少。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值