觸發器 基礎與應用(六)

2021-05-26 04:37:28 字數 4718 閱讀 8252

下面我摘錄了sql server官方教程中的一段關於觸發器的文字,確實有用的一點文字描述。

可以定義乙個無論何時用insert語句向表中插入資料時都會執行的觸發器。

當觸發insert觸發器時,新的資料行就會被插入到觸發器表和inserted表中。inserted表是乙個邏輯表,它包含了已經插入的資料行的乙個副本。inserted表包含了insert語句中已記錄的插入動作。inserted表還允許引用由初始化insert語句而產生的日誌資料。觸發器通過檢查inserted表來確定是否執行觸發器動作或如何執行它。inserted表中的行總是觸發器表中一行或多行的副本。

日誌記錄了所有修改資料的動作(insert、update和delete語句),但在事務日誌中的資訊是不可讀的。然而,inserted表允許你引用由insert語句引起的日誌變化,這樣就可以將插入資料與發生的變化進行比較,來驗證它們或採取進一步的動作。也可以直接引用插入的資料,而不必將它們儲存到變數中。

示例在本例中,將建立乙個觸發器。無論何時訂購產品(無論何時向order details表中插入一條記錄),這個觸發器都將更新products表中的一列(unitsinstock)。用原來的值減去訂購的數量值即為新值。

use northwind

create trigger orddet_insert

on [order details]

for insert

asupdate p set

unitsinstock = p.unitsinstock – i.quantity

from products as p inner join inserted as i

on p.productid = i.productid

delete觸發器的工作過程

當觸發delete觸發器後,從受影響的表中刪除的行將被放置到乙個特殊的deleted表中。deleted表是乙個邏輯表,它保留已被刪除資料行的乙個副本。deleted表還允許引用由初始化delete語句產生的日誌資料。

使用delete觸發器時,需要考慮以下的事項和原則:

·當某行被新增到deleted表中時,它就不再存在於資料庫表中;因此,deleted表和資料庫表沒有相同的行。

·建立deleted表時,空間是從記憶體中分配的。deleted表總是被儲存在快取記憶體中。

·為delete動作定義的觸發器並不執行truncate table語句,原因在於日誌不記錄truncate table語句。

示例在本例中,將建立乙個觸發器,無論何時刪除乙個產品類別(即從categories表中刪除一條記錄),該觸發器都會更新products表中的discontinued列。所有受影響的產品都標記為1,標示不再使用這些產品了。

use northwind

create trigger category_delete

on categories

for delete

asupdate p set discontinued = 1

from products as p inner join deleted as d

on p.categoryid = d.categoryid

update觸發器的工作過程

可將update語句看成兩步操作:即捕獲資料前像(before image)的delete語句,和捕獲資料後像(after image)的insert語句。當在定義有觸發器的表上執行update語句時,原始行(前像)被移入到deleted表,更新行(後像)被移入到inserted表。

觸發器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執行觸發器動作。

可以使用if update語句定義乙個監視指定列的資料更新的觸發器。這樣,就可以讓觸發器容易的隔離出特定列的活動。當它檢測到指定列已經更新時,觸發器就會進一步執行適當的動作,例如發出錯誤資訊指出該列不能更新,或者根據新的更新的列值執行一系列的動作語句。

語法if update () 例1

本例阻止使用者修改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 customersmex from customers where customers.country = 'mexico'go

在該資料上建立檢視:

create view customersview as

select * from customersger

union

select * from customersmexgo

建立乙個在上述檢視上的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 customersmex

set customersmex.phone = inserted.phone

from customersmex join inserted

on customersmex.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表以及被更新的表,來確定是否更新了多行以及如何執行觸發器動作。

觸發器六 系統觸發器 學習筆記

系統觸發器用於監視資料庫服務的開啟 關閉 錯誤等資訊的取得,或者是監控使用者的行為操作等。如果要建立系統觸發器,可以使用如下的語法 create or replace trigger 觸發器名稱 before after 資料庫事件 on database schema when 觸發條件 decl...

觸發器六 系統觸發器 學習筆記

系統觸發器用於監視資料庫服務的開啟 關閉 錯誤等資訊的取得,或者是監控使用者的行為操作等。如果要建立系統觸發器,可以使用如下的語法 create or replace trigger 觸發器名稱 before after 資料庫事件 on database schema when 觸發條件 decl...

基礎 觸發器

github mysql 從 5.0.2 開始支援觸發器。觸發是與表相關的資料庫操作,在滿足定義條件時觸發,並執行觸發器中定義的語句。可以協助應用程式在資料庫端確保資料的完整性,減少不必要的邏輯處理。觸發器只能建立在永久表上,不能建立在臨時表上。對於同乙個表,相同觸發時間,相同觸發事件,只能定義乙個...