触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
触发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作…… 同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序.
create table Student
(
StudentId int primary key
)
--学生表 学号
create Table BorrowRecord
(
BorrowRecord int identity(1,1),
StudentId int,
BorrowDate datetime,
ReturnDate datetime
)
--学生借书记录表 流水号 学号 借出时间 归还时间
--题1 如果我更改了学生的学号,我希望他的借书记录仍然
--与这个学生相关(也就是同时更改借书记录表的学号)
--解题:这时候可用到触发器,创建一个Update触发器
create Trigger truStudent
on Student --在Student表中创建触发器
for Update --为什么事件触发
As --事情触发后要做的事情
if Update(StudentId)
begin
Update BorrowRecord
set StudentId=i.StudentId
from BorrowRecord br,Deleted d,Inserted i --Deleted 和Inserted 临时表
where br.StudentId=d.StudentId
end
--一个Update的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新记录
--题2:如果该学生已经毕业,我希望删除他的学号的同时也删除他的借书记录
--解题:创建一个Delete触发器
create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br,Deleted d
where br.StudentId=d.StudentId
什么时候用触发器?
假设有两张表,一张为操作记录表tbA(MyID,MyX,MyY),一张为账户余额表tbB(MyID,MySum)
MyID:int类型
MyX:money类型
MyY:int类型(-1取钱,1存钱)
MySum:money类型
我想在我记录存入多少钱的同时,在余额表里的MySum里的数据也更着改变,而我们也不需要对余额有任何操作
示例代码如下:
create trigger MyMoneyTrg
on tbA
for insert,update
as
declare @ID int,
@X money,
@Y int
begin
select @ID=MyID,@X=MyX,@Y=MyY from inserted
--这里从inserted表里取到了更新的必要数据,inserted表是更新的数据暂时存放的表,触发器执行结束这个表就消失了
update tbB set MySum=(@X*@Y+Mysum) where MyID=@ID
end
这个范例能在触发器的作用\方法\语法等方面描述触发器