您的位置:首页 > 其它

机房收费系统个人版-----触发器

2013-07-01 21:24 162 查看
1触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动的,而是由事务触发的;它也是由T_SQL语句组成,可以完成存储过程能完成的功能。

2个人理解:触发器,只要满足某特定条件(insert,delete,update),一触即发。

3作用:常用于加强数据的完整性约束和业务规则等。

4触发器与存储过程的不同在于:
5、触发器的优点:

触发器包含复杂的处理逻辑,能够实现复杂的完整性约束。主要有如下优点

触发器自动执行。

触发器能够对数据库中的相关表实现级联更改。触发器基于一个表,但可以实现多表操作,实现相关表的级联操作。

触发器可以实现比CHECK约束更为复杂的数据完整性约束。

触发器可以评估数据修改前后的表的状态,并根据其差异采取对策。

一个表中可以同时存在三个不同操作的触发器(insert、update、delete),对于同一个修改语句可以有多个不同的相应对策。

6、慎用触发器器

触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作……
同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。
7、触发器在机房收费系统个人版中的应用
机房收费系统中的退卡操作:它需要删除T_Student表(注册)中的某条记录,同时把删除记录的卡号,退卡金额,日期,时间插入到T_Cancel表(退卡记录)中。
D层代码:
'注销卡号及写入退卡记录表中(在数据库设置触发器,实现了多表操作,要么成功,要么失败!)
		    Public Function CancelCard(ByVal enStudent As Entity.StudentEntity) As Entity.StudentEntity Implements IDAL.StudetInfo.CancelCard
		        Dim strSql As String = "select * from T_Student where cardNo='" & enStudent.CardNo & "'"
		        Dim cmd As SqlCommand
		        Dim myDA As SqlDataAdapter
		        Dim myDT As New DataTable
		
		        Dim strSql1 As String = "delete from T_Student where cardNo='" & enStudent.CardNo & "'"
		        Dim cmd1 As SqlCommand
		        cmd = New SqlCommand(strSql, conn)
		        myDA = New SqlDataAdapter(cmd)
		        conn.Open()
		        '先查询,把要删除的记录找到,去除
		        myDA.Fill(myDT)
		        If myDT.Rows.Count > 0 Then
		            enStudent.Money = myDT.Rows(0).Item(8)
		           
		            '执行删除操作时,激活触发器,然后执行相应的操作。
		            cmd1 = New SqlCommand(strSql1, conn)
		            If cmd1.ExecuteNonQuery > 0 Then
		                Return enStudent
		            Else
		
		                Throw New Exception("操作失败!")
		            End If
		        Else
		            Throw New Exception("此卡号不存在!")
		        End If
		        conn.Close()
		    End Function


数据库中的触发器:myTrigger
USE [Charge3]
			GO
			create trigger [dbo].[myTrigger] on [dbo].[T_Student]
			for delete
			as 
			--声明变量
			declare @cardNo varchar(8)
			declare @CancelCash   Varchar(50)
			declare @date Varchar(10)
			declare @time Varchar(8)
			--给变量赋值
			select @cardNo =cardNo from deleted 
			select @CancelCash = Money from deleted 
			set @date=CONVERT(varchar(10),getdate(),111) --获取日期
			set @time=CONVERT (varchar(8),getdate(),108)--获取时间
			
			if @@ROWCOUNT >0  --受影响的行数
			begin
				Insert into T_CancelCard(cardNo,cancelCash ,date ,time )values (@cardNo ,@CancelCash ,@date ,@time )
				rollback Tran  --回滚事务
			end


补充:在数据库中获取日期和时间,参数的不懂,有多种表现形式。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: