在学习数据库时就接触到了触发器,当初只是作为自考学习中的一个知识点看待,简单理解了一下理论基础,并没有真正的在实际中应用,现在系统中常见在使用,自己也在尝试。遇到新鲜的没有接触过的事物,我们应该拥有一颗好奇心,去探索求知,而不是有所抵触,不敢使用。之前我属于后者,总是害怕自己无法成功使用,现在心态已有所转变,大胆去用。
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。在机房收费系统中,我将其运用在了退卡功能中,由于我的退卡操作涉及到三张表,Update T_Card 使其“Status”字段更新为“不使用”状态, Delete T_Student 只要退卡就将该卡号的学生信息删除,Insert T_CancelCard 向其中填入退卡记录。退卡是由Insert主事件来触发并激活另外两个操作,这一系列操作只需在sql server中使用sql语句来完成即可,如下:
在七层联系中,只需要写跟插入相关的一些操作即可,与数据库中触发器的连接没有过多要求。
D层:
Public Class SqlCancelCardDAL : Implements IDAL.ICancelCard
Private sqlHelper As New DAL.SqlHelper
'注销卡号及写入退卡记录表中(在数据库设置触发器,实现了多表操作T_Student,T_Card,要么成功,要么失败!)
Public Function CancelStuCard(CancelCard As Entity.T_CancelCardEntity) As Boolean Implements ICancelCard.CancelStuCard
Dim sql As String
Dim flag As Boolean
Dim sqlParmas As SqlParameter() = {New SqlParameter("@StudentNo", CancelCard.StudentNo),
New SqlParameter("@cardNo", CancelCard.CardNo),
New SqlParameter("@Cash", CancelCard.CancelCash),
New SqlParameter("@Canceldate", CancelCard.NowDate),
New SqlParameter("@Canceltime", CancelCard.Time),
New SqlParameter("@UserID", CancelCard.UserID),
New SqlParameter("@Ischeck", CancelCard.IsCheck)}
sql = "insert into T_CancelCard(StudentNo,cardNo,Cash,Canceldate,Canceltime,UserID,Ischeck) values (@StudentNo,@cardNo,@Cash,@Canceldate,@Canceltime,@UserID,@Ischeck)"
flag = sqlHelper.ExecAddDelUpdate(sql, CommandType.Text, sqlParmas)
Return flag
End Function
其实这样下来触发器并没有想象中的难,只要去用,去学习就够了。
比较一下触发器,优点大大加强了数据库的完整新约束及各种业务规划,缺点就是正因为如此多的约束条件和联系,使得对数据库维护存在困难。而触发器与存储过程的唯一区别便是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。之后就对存储过程展开学习和讨论。