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
补充:在数据库中获取日期和时间,参数的不懂,有多种表现形式。