在触发器的工作过程中,系统提供了一个行计数的全局变量@@rowcount,它有着非常重要的作用。 首先,通过它可以知道表中受某个操作影响的行数,这样可以避免不必要的操作。如果某个表已经建立触发器,那么在进行Insert,Delete或Update的操作时,可以通过全局变量@@rowcount了解表中的行是否受影响,有多少行受影响,因为它记录了受影响的行数。 其次,通过它可以实现对表插入或更新操作的主键外键参照完整性。可以将inserted表与相应的主表在主键列上进行连接操作所得到的行数跟进入触发器的全局变量@@rowcount进行比较,如果相等,表明对从表插入或更新操作的外键新值在主表的主键列中已经存在,允许对从表操作;否则,要么不允许对从表操作,要么作其他处理。
4 触发器的应用实例 我们先作一个约定:假设现在有一个主表Base(id,name)和一个从表Sales(id,account),Base中的id为主键,那么Sales中的id为外键。下面举例说明上述的3种触发器。 4.1 Delete触发器 现在准备删除主表Base中的一行,由于Base是主表,所以希望能把从表Sales中的相关记录一起删去,以保持参照完整性,为此,创建Delete触发器如下: create trigger trg-d-base on base for delete as if @@rowcount=0 return delete sales from sales s, deleted d where s. id=d.id return 4.2 Insert触发器 现在准备在从表ales中插入一行,希望检查新的id是否合法,即是否在主表Base的主键列中存在,以保持参照完整性,为此,创建Insert触发器如下: create trigger trg-iu-sales on sales for insert, update as declare @n-row int select @n-row=@@rowcount if @n-row=0 return if (select count(*) from base b, inserted i where b.id=i.id)!=@n-row begin raiserror 31113“不能插入在主表中不存在的外键。” rollback transaction return end return 4.3 Update触发器 现在准备更新主表Base中的一个id,由于Base是主表,所以希望能把从表Sales中的相关记录的id一起更新,以保持参照完整性,为此,创建Update触发器如下: create trigger trg-u-base on base for update as declare @n-row int select @n-row=@@rowcount if @n-row=0 return if update(id) begin if @n-row>1 begin raiserror 31113“不能把多个主键更新成同一个值。” rollback transaction return end update sales set s.id=i.id from sales s, inserted i, deleted d where s. id=d.id end return
作者单位:杨基镇 广东省汕头市国土房产局产权科工程师(515041)
|