狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

SQL2000觸發器的使用[轉]

admin
2010年6月27日 17:34 本文熱度 6531
觸發器是數據庫應用中的重用工具,它的應用很廣泛。這幾天寫一個化學數據統計方面的軟件,需要根據采樣,自動計算方差,在這里,我使用了觸發器。 [br][br]下面我摘錄了sql server官方教程中的一段關于觸發器的文字,確實有用的一點文字描述。 [br][br]可以定義一個無論何時用insert語句向表中插入數據時都會執行的觸發器。 [br][br]當觸發insert觸發器時,新的數據行就會被插入到觸發器表和inserted表中。inserted表是一個邏輯表,它包含了已經插入的數據行的一個副本。inserted表包含了insert語句中已記錄的插入動作。inserted表還允許引用由初始化insert語句而產生的日志數據。觸發器通過檢查inserted表來確定是否執行觸發器動作或如何執行它。inserted表中的行總是觸發器表中一行或多行的副本。 [br][br]日志記錄了所有修改數據的動作(insert、update和delete語句),但在事務日志中的信息是不可讀的。然而,inserted表允許你引用由insert語句引起的日志變化,這樣就可以將插入數據與發生的變化進行比較,來驗證它們或采取進一步的動作。也可以直接引用插入的數據,而不必將它們存儲到變量中。 [br][br]示例 [br][br]在本例中,將創建一個觸發器。無論何時訂購產品(無論何時向order details表中插入一條記錄),這個觸發器都將更新products表中的一列(unitsinstock)。用原來的值減去訂購的數量值即為新值。 [br][br]use northwind [br]create trigger orddet_insert [br]on [order details] [br]for insert [br]as [br]update p set [br]unitsinstock = p.unitsinstock – i.quantity [br]from products as p inner join inserted as i [br]on p.productid = i.productid [br][br]delete觸發器的工作過程 [br][br]當觸發delete觸發器后,從受影響的表中刪除的行將被放置到一個特殊的deleted表中。deleted表是一個邏輯表,它保留已被刪除數據行的一個副本。deleted表還允許引用由初始化delete語句產生的日志數據。 [br][br]使用delete觸發器時,需要考慮以下的事項和原則: [br][br]·當某行被添加到deleted表中時,它就不再存在于數據庫表中;因此,deleted表和數據庫表沒有相同的行。 [br][br]·創建deleted表時,空間是從內存中分配的。deleted表總是被存儲在高速緩存中。 [br][br]·為delete動作定義的觸發器并不執行truncate table語句,原因在于日志不記錄truncate table語句。 [br][br]示例 [br][br]在本例中,將創建一個觸發器,無論何時刪除一個產品類別(即從categories表中刪除一條記錄),該觸發器都會更新products表中的discontinued列。所有受影響的產品都標記為1,標示不再使用這些產品了。 [br][br]use northwind [br]create trigger category_delete [br]on categories [br]for delete [br]as [br]update p set discontinued = 1 [br]from products as p inner join deleted as d [br]on p.categoryid = d.categoryid [br][br]update觸發器的工作過程 [br][br]可將update語句看成兩步操作:即捕獲數據前像(before image)的delete語句,和捕獲數據后像(after image)的insert語句。當在定義有觸發器的表上執行update語句時,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。 [br][br]觸發器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執行觸發器動作。 [br][br]可以使用if update語句定義一個監視指定列的數據更新的觸發器。這樣,就可以讓觸發器容易的隔離出特定列的活動。當它檢測到指定列已經更新時,觸發器就會進一步執行適當的動作,例如發出錯誤信息指出該列不能更新,或者根據新的更新的列值執行一系列的動作語句。 [br][br]語法 [br][br]if update () [br][br]例1 [br][br]本例阻止用戶修改employees表中的employeeid列。 [br][br]use northwind [br]go [br]create trigger employee_update [br]on employees [br]for update [br]as [br]if update (employeeid) [br]begin [br]raiserror ('transaction cannot be processed.\ [br]***** employee id number cannot be modified.', 10, 1) [br]rollback transaction [br]end [br][br]instead of觸發器的工作過程 [br][br]可以在表或視圖上指定instead of觸發器。執行這種觸發器就能夠替代原始的觸發動作。instead of觸發器擴展了視圖更新的類型。對于每一種觸發動作(insert、update或 delete),每一個表或視圖只能有一個instead of觸發器。 [br][br]instead of觸發器被用于更新那些沒有辦法通過正常方式更新的視圖。例如,通常不能在一個基于連接的視圖上進行delete操作。然而,可以編寫一個instead of delete觸發器來實現刪除。上述觸發器可以訪問那些如果視圖是一個真正的表時已經被刪除的數據行。將被刪除的行存儲在一個名為deleted的工作表中,就像after觸發器一樣。相似地,在update instead of觸發器或者insert instead of觸發器中,你可以訪問inserted表中的新行。 [br][br]不能在帶有with check option定義的視圖中創建instead of觸發器。 [br][br]示例 [br][br]在本例中,創建了一個德國客戶表和一個墨西哥客戶表。放置在視圖上的instead of觸發器將把更新操作重新定向到適當的基表上。這時發生的插入是對customersger表的插入而不是對視圖的插入。 [br][br]創建兩個包含客戶數據的表: [br][br]select * into customersger from customers where customers.country = 'germany' [br]select * into customersmex from customers where customers.country = 'mexico' [br][br]go [br][br]在該數據上創建視圖: [br][br]create view customersview as [br]select * from customersger [br]union [br]select * from customersmex [br]go [br][br]創建一個在上述視圖上的instead of觸發器: [br][br]create trigger customers_update2 [br][br]on customersview [br][br]instead of update as [br][br]declare @country nvarchar(15) [br][br]set @country = (select country from inserted) [br][br]if @country = 'germany' [br][br]begin [br][br]update customersger [br][br]set customersger.phone = inserted.phone [br][br]from customersger join inserted [br][br]on customersger.customerid = inserted.customerid [br][br]end [br][br]else [br][br]if @country = 'mexico' [br][br]begin [br][br]update customersmex [br][br]set customersmex.phone = inserted.phone [br][br]from customersmex join inserted [br][br]on customersmex.customerid = inserted.customerid [br][br]end [br][br]通過更新視圖,測試觸發器: [br][br]update customersview set phone = ' 030-007xxxx' [br]where customerid = 'alfki' [br][br]select customerid, phone from customersview [br]where customerid = 'alfki' [br][br]select customerid, phone from customersger [br]where customerid = 'alfki' [br][br]那么具體的講,對于多列數據,如何計算方差呢?: [br][br]create trigger [calt1t2t3] on dbo.dclb [br]for insert,update [br]as [br]update p [br]set [br]/**//* [br]計算方差的觸發器 [br]*/ [br]p.t1=(i.p1+i.p2+i.p3+i.p4+i.p5+i.p6), [br]p.t2=(i.y1+i.y2+i.y3+i.y4+i.y5+i.y6 ), [br]p.t3=sqrt(p.t1*p.t1+p.t2*p.t2) [br][br]from dclb as p inner join inserted as i [br]on p.sid = i.sid [br][br]觸發器的使用很方便,而且也很簡單,重要的是理解inserted過程。可將update語句看成兩步操作:即捕獲數據前像(before image)的delete語句,和捕獲數據后像(after image)的insert語句。當在定義有觸發器的表上執行update語句時,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。觸發器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執行觸發器動作。 [br]文章來源:[url=http://hi.baidu.com/tsredsun/blog/item/3bf2cdcaae9e6984c8176822.html]http://hi.baidu.com/tsredsun/blog/item/3bf2cdcaae9e6984c8176822.html[/url]

該文章在 2010/6/27 17:34:08 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved