在觸發(fā)器的工作過(guò)程中,系統提供了一個(gè)行計數的全局變量@@rowcount,它有著(zhù)非常重要的作用。 首先,通過(guò)它可以知道表中受某個(gè)操作影響的行數,這樣可以避免不必要的操作。如果某個(gè)表已經(jīng)建立觸發(fā)器,那么在進(jìn)行Insert,Delete或Update的操作時(shí),可以通過(guò)全局變量@@rowcount了解表中的行是否受影響,有多少行受影響,因為它記錄了受影響的行數。 其次,通過(guò)它可以實(shí)現對表插入或更新操作的主鍵外鍵參照完整性??梢詫nserted表與相應的主表在主鍵列上進(jìn)行連接操作所得到的行數跟進(jìn)入觸發(fā)器的全局變量@@rowcount進(jìn)行比較,如果相等,表明對從表插入或更新操作的外鍵新值在主表的主鍵列中已經(jīng)存在,允許對從表操作;否則,要么不允許對從表操作,要么作其他處理。 4 觸發(fā)器的應用實(shí)例 我們先作一個(gè)約定:假設現在有一個(gè)主表Base(id,name)和一個(gè)從表Sales(id,account),Base中的id為主鍵,那么Sales中的id為外鍵。下面舉例說(shuō)明上述的3種觸發(fā)器。 4.1 Delete觸發(fā)器 現在準備刪除主表Base中的一行,由于Base是主表,所以希望能把從表Sales中的相關(guān)記錄一起刪去,以保持參照完整性,為此,創(chuàng )建Delete觸發(fā)器如下: 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觸發(fā)器 現在準備在從表ales中插入一行,希望檢查新的id是否合法,即是否在主表Base的主鍵列中存在,以保持參照完整性,為此,創(chuàng )建Insert觸發(fā)器如下: 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觸發(fā)器 現在準備更新主表Base中的一個(gè)id,由于Base是主表,所以希望能把從表Sales中的相關(guān)記錄的id一起更新,以保持參照完整性,為此,創(chuàng )建Update觸發(fā)器如下: 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“不能把多個(gè)主鍵更新成同一個(gè)值。” 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 作者單位:楊基鎮 廣東省汕頭市國土房產(chǎn)局產(chǎn)權科工程師(515041) |