觸發器 示例

2021-04-13 02:51:34 字數 2778 閱讀 6498

本例阻止使用者修改employees表中的employeeid列。

use northwind

gocreate trigger employee_update

on employees

for update

asif update (employeeid)

begin

raiserror ('transaction cannot be processed./

***** employee id number cannot be modified.', 10, 1)

rollback transaction

end

instead of觸發器的工作過程

可以在表或檢視上指定instead of觸發器。執行這種觸發器就能夠替代原始的觸發動作。instead of觸發器擴充套件了檢視更新的型別。對於每一種觸發動作(insert、update或 delete),每乙個表或檢視只能有乙個instead of觸發器。

instead of觸發器被用於更新那些沒有辦法通過正常方式更新的檢視。例如,通常不能在乙個基於連線的檢視上進行delete操作。然而,可以編寫乙個instead of delete觸發器來實現刪除。上述觸發器可以訪問那些如果檢視是乙個真正的表時已經被刪除的資料行。將被刪除的行儲存在乙個名為deleted的工作表中,就像after觸發器一樣。相似地,在update instead of觸發器或者insert instead of觸發器中,你可以訪問inserted表中的新行。

不能在帶有with check option定義的檢視中建立instead of觸發器。

在本例中,建立了乙個德國客戶表和乙個墨西哥客戶表。放置在檢視上的instead of觸發器將把更新操作重新定向到適當的基表上。這時發生的插入是對customersger表的插入而不是對檢視的插入。

建立兩個包含客戶資料的表:

select * into customersger from customers where customers.country = 'germany'

select * into customer**ex from customers where customers.country = 'mexico'go

在該資料上建立檢視:

create view customersview as

select * from customersger

union

select * from customer**exgo

建立乙個在上述檢視上的instead of觸發器:

create trigger customers_update2

on customersview

instead of update as

declare @country nvarchar(15)

set @country = (select country from inserted)

if @country = 'germany'

begin

update customersger

set customersger.phone = inserted.phone

from customersger join inserted

on customersger.customerid = inserted.customerid

endelse

if @country = 'mexico'

begin

update customer**ex

set customer**ex.phone = inserted.phone

from customer**ex join inserted

on customer**ex.customerid = inserted.customerid

end

通過更新檢視,測試觸發器:

update customersview set phone = ' 030-007***x'

where customerid = 'alfki'

select customerid, phone from customersview

where customerid = 'alfki'

select customerid, phone from customersger

where customerid = 'alfki'

那麼具體的講,對於多列資料,如何計算方差呢?:

create trigger [calt1t2t3] on dbo.dclb

for insert,update

asupdate p

set/**//*

計算方差的觸發器

*/p.t1=(i.p1+i.p2+i.p3+i.p4+i.p5+i.p6),

p.t2=(i.y1+i.y2+i.y3+i.y4+i.y5+i.y6 ),

p.t3=sqrt(p.t1*p.t1+p.t2*p.t2)

from dclb as p inner join inserted as i

on p.sid = i.sid

觸發器的使用很方便,而且也很簡單,重要的是理解inserted過程。可將update語句看成兩步操作:即捕獲資料前像(before image)的delete語句,和捕獲資料後像(after image)的insert語句。當在定義有觸發器的表上執行update語句時,原始行(前像)被移入到deleted表,更新行(後像)被移入到inserted表。觸發器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執行觸發器動作。

mysql 觸發器示例 MySQL觸發器示例 8

什麼是觸發器 需求 出於審計目的,當有人往表users插入一條記錄時,把插入的uid,uname,插入動作和操作時間記錄下來。delimiter create trigger tr users insert after insert onusersforeach rowbegin insert in...

mysql 觸發器示例

一些操作會觸發的函式。如更新 增刪改 rule hzq all 或 b rule table 表的時候,我們希望對更新操作做記錄。這種情況使用觸發器,使用者對 rule hzq all 有更新操作時,觸發記錄函式。create table update history bussiness varch...

Oracle觸發器簡單示例

首先建立兩張測試表 create table test t id number 4 t name varchar2 20 t age number 2 t char create table test log caozuo varchar2 20 tdate date 然後建立觸發器並且進行測試 c...