① 觸發器使用在不同的伺服器上該怎麼寫
SQL Server 觸發顫賣器 的例茄冊逗子:
http://hi..com/wangqing999/blog/item/126bdc0c7a7dd79b0a7b829d.html
SQL Server 數據姿察庫鏈接 的例子:
http://hi..com/wangqing999/blog/item/6aa237820385cf2e66096e76.html
② SQL中,觸發器是什麼
1. 基本概念x0dx0a觸發器是特殊的存儲過程,基於一個表創建,主要作用就是實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據一致性。x0dx0a當觸發器所保護的數據發生變化(update,insert,delete)後,自動運行以保證數據的完整性和正確性。通俗的說:通過一個動作(update,insert,delete)調用一個存儲過程(觸發器)。肢早x0dx0a2. 類型x0dx0a(1)DML觸發器x0dx0a在資料庫中發生數據操作語言(DML)事件時將啟用。DML 事件包括在指定表或視圖中修改數據的 INSERT 語句、UPDATE 語句或 DELETE 語句。DML 觸發器可以查詢其他表,還可以包含復雜的 T-SQL 語句。系統將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務對待,如果檢測到錯誤(例如,磁碟空間不足),則整個事務即自動回滾。x0dx0a(2)DDL 觸發器x0dx0aSQL Server 2005 的新增功能。當伺服器或資料庫中發生數據定義語言(DDL)事件時將調用這些觸發器。但與DML觸發器不同的是,它們不會為響應針對表或視圖的UPDATE、INSERT或DELETE語句而激發,相反,它們會為響應多種數據定義語言(DDL)語句而激發。這些語句主要是以CREATE、ALTER和DROP開頭的語句。DDL觸發器可用於管理任務,例如審核和控制資料庫操作。x0dx0a 創建DML觸發器x0dx0a1. 使用存儲過程模板創建存儲過程x0dx0a在【對象資源管理器】窗口中,展開「資料庫」節點,再展歷數雀開所選擇的具體資料庫節點,再展開「表」節點,右擊要創建觸發器的「表」,選擇「新建觸發器」命令,如圖所示:x0dx0a在右側查詢編輯器中出現觸發器設計模板,用戶可以在此基礎上編輯觸發器,單擊「執行」按鈕,即可創建該觸發器。x0dx0ax0dx0a2. 使用T-SQL語句創建表x0dx0aCREATE TRIGGER 觸發器x0dx0aON 表名x0dx0aFOR[update,insert,delete ]x0dx0aAS SQL語句x0dx0a例9-6:創建基於表reader ,DELETE操作的觸發器。x0dx0aUSE Libraryx0dx0aGOx0dx0aIF EXISTS(SELECT name FROM sysobjectsx0dx0a WHERE name='reader_d' AND type='TR')x0dx0aDROP TRIGGER reader_d --如果已經存在觸發器reader_d則刪除x0dx0aGOx0dx0aCREATE TRIGGER reader_d --創建觸發器x0dx0aON reader --基於表 x0dx0aFOR DELETE --刪除事件x0dx0aASx0dx0aPRINT '數據被刪除!' --執行顯示輸出x0dx0aGOx0dx0a 試試吧!x0dx0a應用:x0dx0aUSE Libraryx0dx0aGOx0dx0aDELETE readerx0dx0awhere Rname='aaa'x0dx0a執行結果:x0dx0a數據被刪除!x0dx0a(所影響的行數為 1 行)x0dx0a例9-7:在表borrow中添加借閱信息記錄時,得到畢凱該書的應還日期。x0dx0a說明:在表borrow中增加一個應還日期SReturnDate。x0dx0aUSE Libraryx0dx0aIF EXISTS (SELECT name FROM sysobjectsx0dx0aWHERE name ='T_return_date' AND type='TR')x0dx0aDROP TRIGGER T_return_datex0dx0aGOx0dx0aCREATE TRIGGER T_return_date --創建觸發器x0dx0aON Borrow --基於表borrowx0dx0aAfter INSERT --插入操作x0dx0aASx0dx0a--查詢插入記錄INSERTED中讀者的類型x0dx0aDECLARE @type int,@dzbh char(10),@tsbh char(15)x0dx0aSET @dzbh=(SELECT RID FROM inserted)x0dx0aSET @tsbh=(SELECT BID FROM inserted)x0dx0aSELECT @type= TypeIDx0dx0aFROM readerx0dx0aWHERE RID=(SELECT RID FROM inserted)--副本x0dx0a/*把Borrow表中的應還日期改為x0dx0a當前日期加上各類讀者的借閱期限*/x0dx0aUPDATE Borrow SET SReturnDate=getdate()+x0dx0aCASE x0dx0a WHEN @type=1 THEN 90x0dx0a WHEN @type=2 THEN 60x0dx0a WHEN @type=3 THEN 30x0dx0aENDx0dx0aWHERE RID=@dzbh and BID=@tsbhx0dx0a應用:x0dx0aUSE Libraryx0dx0aINSERT INTO borrow(RID,BID) values(','TP85-08')x0dx0a查看記錄:x0dx0a x0dx0a例9-8:在資料庫Library中,當讀者還書時,實際上要修改表brorrowinf中相應記錄還期列的值,請計算出是否過期。x0dx0aUSE Libraryx0dx0aIF EXISTS(SELECT name FROM sysobjectsx0dx0aWHERE name='T_fine_js' AND type='TR')x0dx0aDROP TRIGGER T_fine_jsx0dx0aGOx0dx0aCREATE TRIGGER T_fine_jsx0dx0aON borrowx0dx0aAfter UPDATEx0dx0aASx0dx0aDECLARE @days int,@dzbh char(10),@tsbh char(15)x0dx0aSET @dzbh=(select RID from inserted)x0dx0aSET @tsbh=(select BID from inserted)x0dx0aSELECT @days=DATEDIFF(day, ReturnDate, SReturnDate)x0dx0a--DATEDIFF函數返回兩個日期之差,單位為DAYx0dx0aFROM borrowx0dx0aWHERE RID=@dzbh and BID=@tsbhx0dx0aIF @days>0x0dx0a PRINT '沒有過期!'x0dx0aELSEx0dx0a PRINT '過期'+convert(char(6),@days)+'天'x0dx0aGOx0dx0a應用:x0dx0aUSE Libraryx0dx0aUPDATE borrow SET ReturnDate=-12-12'x0dx0aWHERE RID=' and BID='TP85-08'x0dx0aGOx0dx0a執行結果:x0dx0a過期-157 天x0dx0a(1 行受影響)x0dx0a例9-9:對Library庫中Reader表的 DELETE操作定義觸發器。x0dx0aUSE Libraryx0dx0aGOx0dx0aIF EXISTS(SELECT name FROM sysobjectsx0dx0a WHERE name='reader_d' AND type='TR')x0dx0aDROP TRIGGER reader_dx0dx0aGOx0dx0aCREATE TRIGGER reader_dx0dx0aON Readerx0dx0aFOR DELETEx0dx0aASx0dx0aDECLARE @data_yj intx0dx0aSELECT @data_yj=Lendnumx0dx0aFROM deletedx0dx0aIF @data_yj>0x0dx0a BEGINx0dx0a PRINT '該讀者不能刪除!還有'+convert(char(2),@data_yj)+'本書沒還。x0dx0a ROLLBACKx0dx0a ENDx0dx0aELSEx0dx0a PRINT '該讀者已被刪除!'x0dx0aGOx0dx0a應用:x0dx0aUSE Libraryx0dx0aGOx0dx0aDELETE Reader WHERE RID='x0dx0a執行結果:x0dx0a該讀者不能刪除!還有4 本書沒還。x0dx0a 修改觸發器x0dx0aALTER TRIGGER 觸發器x0dx0a 刪除觸發器x0dx0aDROP TRIGGER 觸發器x0dx0a 查看觸發器x0dx0asp_helptext trigger_namex0dx0asp_helptrigger table_name
③ SQL中觸發器主要用於實施什麼類型的數據完整性如何實施
[編輯本段]SQL觸發器
觸發器是一種特殊類型的存儲過程,不由用戶直接調用。創建觸發器時會對其進行定義,以便在對特定表或列作特定類型的數據修改時執行。 CREATE PROCEDURE 或 CREATE TRIGGER 語句不能跨越批處理。即存儲過程或觸發器始終只能在一個批處理中創建並編譯到一個執行計劃中。 用觸發寬神裂器還可以強制執行業務規則 Microsoft® SQL Server™ 2000 提供了兩種主要機制來強制業務規則和數據完整性:約束和觸發器。觸發器是一種特殊類型的存儲過程,它在指定的表中的數據發生變化時自動生效。喚醒調用觸發器以響應 INSERT、UPDATE 或 DELETE 語句。觸發器可以查詢其它表,並可以包含復雜的 Transact-SQL 語句。將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務對待。如果檢測到嚴重錯誤(例如,磁碟空間不足),則整個事務即自動回滾。
[編輯本段]優點
觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。 觸發器可以強制比用 CHECK 約束定義的約束更為復雜的約束。 與 CHECK 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。 觸發器也可以評估數據修改前後的表狀態,並根據其差異採取對策。 一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許採取多個不同的對策以響應同一個修改語句。 比較觸發器與約束 約束和觸發器在特殊情況下各有優勢。觸發器的主要好處在於它們可以包含使用 Transact-SQL 代碼的復雜處理邏輯。因此,觸發器可以支持約束的所有功能;但它在所給出的功能上並不總是最好的方法。 實體完整性總應在最低級別上通過索引進行強制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨立創建的。假設功能可以滿足應用程序的功能需求,域完整性應通過 CHECK 約束進行強制,而引用完整性 (RI) 則應通過 FOREIGN KEY 約束進行強制。 在約束所支持的功能無法滿足應用程序的功能要求時,觸發器就極為有用。例如: 除非 REFERENCES 子句定義了級聯引用操作,否則 FOREIGN KEY 約束只能以與另一列中的值完全匹配的值來驗證列值。 CHECK 約束只能根據邏輯表達式或同一表中的另一列來驗證列值。如果應用程序要求根據另一個表中的列驗證列值,則必須使用觸發器。 約慎閉束只能通過標準的系統錯誤信息傳遞錯誤信息。如果應用程序要求使用(或能從中獲益)自定義信息和較為復雜的錯誤處理,則必須使用觸發器。 觸發器可通過資料庫中的相關表實現級聯更改;瞎梁不過,通過級聯引用完整性約束可以更有效地執行這些更改。 觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生作用。例如,可以在 titleauthor.title_id 上創建一個插入觸發器,使它在新值與 titles.title_id 中的某個值不匹配時回滾一個插入。不過,通常使用 FOREIGN KEY 來達到這個目的。 如果觸發器表上存在約束,則在 INSTEAD OF 觸發器執行後但在 AFTER 觸發器執行前檢查這些約束。如果約束破壞,則回滾 INSTEAD OF 觸發器操作並且不執行 AFTER 觸發器。
[編輯本段]SQL觸發器語法
語法 CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ DELETE ] [ UPDATE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) updated_bitmask ) column_bitmask [ ...n ] } ] sql_statement [ ...n ] } } 參數 trigger_name 是觸發器的名稱。觸發器名稱必須符合標識符規則,並且在資料庫中必須唯一。可以選擇是否指定觸發器所有者名稱。 Table | view 是在其上執行觸發器的表或視圖,有時稱為觸發器表或觸發器視圖。可以選擇是否指定表或視圖的所有者名稱。 WITH ENCRYPTION 加密 syscomments 表中包含 CREATE TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止將觸發器作為 SQL Server 復制的一部分發布。 AFTER 指定觸發器只有在觸發 SQL 語句中指定的所有操作都已成功執行後才激發。所有的引用級聯操作和約束檢查也必須成功完成後,才能執行此觸發器。 如果僅指定 FOR 關鍵字,則 AFTER 是默認設置。 不能在視圖上定義 AFTER 觸發器。 INSTEAD OF 指定執行觸發器而不是執行觸發 SQL 語句,從而替代觸發語句的操作。 在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發器。然而,可以在每個具有 INSTEAD OF 觸發器的視圖上定義視圖。 INSTEAD OF 觸發器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項的可更新視圖添加 INSTEAD OF 觸發器,SQL Server 將產生一個錯誤。用戶必須用 ALTER VIEW 刪除該選項後才能定義 INSTEAD OF 觸發器。 { [DELETE] [,] [INSERT] [,] [UPDATE] } 是指定在表或視圖上執行哪些數據修改語句時將激活觸發器的關鍵字。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些關鍵字。如果指定的選項多於一個,需用逗號分隔這些選項。 對於 INSTEAD OF 觸發器,不允許在具有 ON DELETE 級聯操作引用關系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯操作引用關系的表上使用 UPDATE 選項。 WITH APPEND 指定應該添加現有類型的其它觸發器。只有當兼容級別是 65 或更低時,才需要使用該可選子句。如果兼容級別是 70 或更高,則不必使用 WITH APPEND 子句添加現有類型的其它觸發器(這是兼容級別設置為 70 或更高的 CREATE TRIGGER 的默認行為)。有關更多信息,請參見 sp_dbcmptlevel。 WITH APPEND 不能與 INSTEAD OF 觸發器一起使用,或者,如果顯式聲明 AFTER 觸發器,也不能使用該子句。只有當出於向後兼容而指定 FOR 時(沒有 INSTEAD OF 或 AFTER),才能使用 WITH APPEND。以後的版本將不支持 WITH APPEND 和 FOR(將被解釋為 AFTER)。 NOT FOR REPLICATION 表示當復制進程更改觸發器所涉及的表時,不應執行該觸發器。 AS 是觸發器要執行的操作。 sql_statement 是觸發器的條件和操作。觸發器條件指定其它准則,以確定 DELETE、INSERT 或 UPDATE 語句是否導致執行觸發器操作。 當嘗試 DELETE、INSERT 或 UPDATE 操作時,Transact-SQL語句中指定的觸發器操作將生效。 觸發器可以包含任意數量和種類的 Transact-SQL 語句。觸發器旨在根據數據修改語句檢查或更改數據;它不應將數據返回給用戶。觸發器中的 Transact-SQL 語句常常包含控制流語言。CREATE TRIGGER 語句中使用幾個特殊的表: * deleted 和 inserted 是邏輯(概念)表。這些表在結構上類似於定義觸發器的表(也就是在其中嘗試用戶操作的表);這些表用於保存用戶操作可能更改的行的舊值或新值。例如,若要檢索 deleted 表中的所有值,請使用: SELECT * FROM deleted * 如果兼容級別等於 70,那麼在 DELETE、INSERT 或 UPDATE 觸發器中,SQL Server 將不允許引用 inserted 和 deleted 表中的 text、ntext 或 image 列。不能訪問 inserted 和 deleted 表中的 text、ntext 和 image 值。若要在 INSERT 或 UPDATE 觸發器中檢索新值,請將 inserted 表與原始更新表聯接。當兼容級別是 65 或更低時,對 inserted 或 deleted 表中允許空值的text、ntext 或 image 列,將返回空值;如果這些列不可為空,則返回零長度字元串。 當兼容級別是 80 或更高時,SQL Server 允許在表或視圖上通過 INSTEAD OF 觸發器更新 text、ntext 或 image 列。 n 是表示觸發器中可以包含多條 Transact-SQL 語句的佔位符。對於 IF UPDATE (column) 語句,可以通過重復 UPDATE (column) 子句包含多列。 IF UPDATE (column) 測試在指定的列上進行的 INSERT 或 UPDATE 操作,不能用於 DELETE 操作。可以指定多列。因為在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要測試在多個列上進行的 INSERT 或 UPDATE 操作,請在第一個操作後指定單獨的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 將返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。 說明 IF UPDATE (column) 子句的功能等同於 IF、IF...ELSE 或 WHILE 語句,並且可以使用 BEGIN...END 語句塊。有關更多信息,請參見控制流語言。 可以在觸發器主體中的任意位置使用 UPDATE (column)。 column 是要測試 INSERT 或 UPDATE 操作的列名。該列可以是 SQL Server 支持的任何數據類型。但是,計算列不能用於該環境中。有關更多信息,請參見數據類型。 IF (COLUMNS_UPDATED()) 測試是否插入或更新了提及的列,僅用於 INSERT 或 UPDATE 觸發器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。 COLUMNS_UPDATED 函數以從左到右的順序返回位,最左邊的為最不重要的位。最左邊的位表示表中的第一列;向右的下一位表示第二列,依此類推。如果在表上創建的觸發器包含 8 列以上,則 COLUMNS_UPDATED 返回多個位元組,最左邊的為最不重要的位元組。在 INSERT 操作中 COLUMNS_UPDATED 將對所有列返回 TRUE 值,因為這些列插入了顯式值或隱性 (NULL) 值。 可以在觸發器主體中的任意位置使用 COLUMNS_UPDATED。 bitwise_operator 是用於比較運算的位運算符。 updated_bitmask 是整型位掩碼,表示實際更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 觸發器,若要檢查列 C2、C3 和 C4 是否都有更新,指定值 14;若要檢查是否只有列 C2 有更新,指定值 2。 comparison_operator 是比較運算符。使用等號 (=) 檢查 updated_bitmask 中指定的所有列是否都實際進行了更新。使用大於號 (>) 檢查 updated_bitmask 中指定的任一列或某些列是否已更新。 column_bitmask 是要檢查的列的整型位掩碼,用來檢查是否已更新或插入了這些列。 注釋 觸發器常常用於強制業務規則和數據完整性。SQL Server 通過表創建語句(ALTER TABLE 和 CREATE TABLE)提供聲明引用完整性 (DRI);但是 DRI 不提供資料庫間的引用完整性。若要強制引用完整性(有關表的主鍵和外鍵之間關系的規則),請使用主鍵和外鍵約束(ALTER TABLE 和 CREATE TABLE 的 PRIMARY KEY 和 FOREIGN KEY 關鍵字)。如果觸發器表存在約束,則在 INSTEAD OF 觸發器執行之後和 AFTER 觸發器執行之前檢查這些約束。如果違反了約束,則回滾 INSTEAD OF 觸發器操作且不執行(激發)AFTER 觸發器。 可用 sp_settriggerorder 指定表上第一個和最後一個執行的 AFTER 觸發器。在表上只能為每個 INSERT、UPDATE 和 DELETE 操作指定一個第一個執行和一個最後一個執行的 AFTER 觸發器。如果同一表上還有其它 AFTER 觸發器,則這些觸發器將以隨機順序執行。 如果 ALTER TRIGGER 語句更改了第一個或最後一個觸發器,則將除去已修改觸發器上設置的第一個或最後一個特性,而且必須用 sp_settriggerorder 重置排序值。 只有當觸發 SQL 語句(包括所有與更新或刪除的對象關聯的引用級聯操作和約束檢查)成功執行後,AFTER 觸發器才會執行。AFTER 觸發器檢查觸發語句的運行效果,以及所有由觸發語句引起的 UPDATE 和 DELETE 引用級聯操作的效果。 觸發器限制 CREATE TRIGGER 必須是批處理中的第一條語句,並且只能應用到一個表中。 觸發器只能在當前的資料庫中創建,不過觸發器可以引用當前資料庫的外部對象。 如果指定觸發器所有者名稱以限定觸發器,請以相同的方式限定表名。 在同一條 CREATE TRIGGER 語句中,可以為多種用戶操作(如 INSERT 和 UPDATE)定義相同的觸發器操作。 如果一個表的外鍵在 DELETE/UPDATE 操作上定義了級聯,則不能在該表上定義 INSTEAD OF DELETE/UPDATE 觸發器。 在觸發器內可以指定任意的 SET 語句。所選擇的 SET 選項在觸發器執行期間有效,並在觸發器執行完後恢復到以前的設置。
④ mysql編寫一個觸發器
1.從語法上來說,你這樣寫是沒有問題的,因為這里把new當成表名。編譯自然是成功的,但是當插叢陪入數據用到觸發器的時候,就會報找迅鄭核不到new表的錯誤了。
2.列出每一個欄位是可以的,但是寫起來比較麻煩,要這樣:
insert into ct_master1 value (new.c1,new.c2,new.c3);
簡潔的方法,就是畝掘插入的時候設定一個唯一性的值,比如id
然後就可以把insert改成
⑤ wpf 寫一個後台觸發器的實現
你這樣做思路是不符合WPF的思路的,業務邏輯和界面分開,你應該使用viewmodel來做
⑥ 資料庫中觸發器是什麼
資料庫 觸發器有什麼用
觸發器
觸發器的定義就是說某個條件成立的時候,你觸發器裡面所定義的語句就會被自動的執行。因此觸發器不需要人為的去調用,也不能調用。
然後,觸發器的觸發條件其實在你定義的時候就已經設定好的了。這裡面需要說明一下,觸發器可以分為語句級觸發器和行級觸發器。詳細的介紹可以參考網上的資料,簡單的說就是語句級的觸發器可以在某些語句執行前或執行後被觸發。而行級觸發器則是在定義的了觸發的表中的行數據改變時就會被觸發一次。
具體舉例:
1. 在一個表中定義的語句級的觸發器,當這個表被刪除時,程序就會自動執行觸發器裡面定義的操作過程。這個就是刪除表的操作就是觸發器執行的條件了。
2. 在一個表中定義了行級的觸發器,那當這個表中一行數據發生變化的時候,比如刪除了一行記錄,那觸發器也會被自動執行了。
觸發器簡介:
觸發器是一種特殊類型的過程。與普通過程不同的是,過程需要用戶顯式地調用才執行,而觸發器則是當某些事件發生時,由Oracle自動執行。
觸發器主要由如下幾個部分組成:
觸發事件:
觸發條件:
觸發對象:
觸發操作:
編寫觸發器時,需要注意以下幾點:
觸發器不接受參數。
一個表上最多可以有12個觸發器,但同一時間、同一事件、同一類型的觸發器只能有一個。還需要注意,各個觸發器之間不能有矛盾。
在一個表上的觸發器越多,對在該表上的DML操作性能影響就越大。
觸戚氏發器最大為32KB。如果確實需要,可以先建立過程,然後在觸發器中用CALL語句調用。
在DML觸發器中只能使用DML語句(select,insert,update,delete)。
在系統觸發器中只能包含DDL語句(create,alter,drop)。
觸發器中不能包含事務控制語句(mit,rollback,savepoint)。因為觸發器是觸發語句的一部門,觸發語句被提交或回退時,觸發器也就被提交或回退了。
在觸發器主體中調用的任何過程、函數都不能使用事務控制語句。
在觸發器主體中不能聲明任何long和blob變數。新值new、舊值old也不能指向表中的任何long和blog列
不同類型的觸發器(如DML觸發器、INSTEAD OF觸發器、系統觸發器)的語法格式和作用都有較大區別。
SQL中,觸發器是什麼?
1、觸發器。 定義: 何為觸發器?在SQL Server裡面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程序。觸發器是一個特殊的存儲過程。 常見的觸發器有三種:分別應用於枝或Insert , Update , Delete 事件。(SQL Server 2000定義了新的觸發器,這里不提) 我為什麼要使用觸發器?比如,這么兩個表: Create Table Student( --學生表 StudentID int primary key, --學號 .... ) Create Table BorrowRecord( --學生借書記錄表 BorrowRecord int identity(1,1), --流水號 StudentID int , --學號 BorrowDate datetime, --借出時間 ReturnDAte Datetime, --歸還時間 ... ) 用到的功能有: 1.如果我更改了學生的學號,我希望他的借書記錄仍然與這個學生相關(也就是同時更改借書記猛仔伍錄表的學號); 2.如果該學生已經畢業,我希望刪除他的學號的同時,也刪除它的借書記錄。 等等。 這時候可以用到觸發器。對於1,創建一個Update觸發器: Create Trigger truStudent On Student for Update ------------------------------------------------------- --Name:truStudent --func:更新BorrowRecord 的StudentID,與Student同步。 --Use :None --User:System --Author: 懶蟲 # SapphireStudio ( chair3) --Date : 2003-4-16 --Memo : 臨時寫寫的,給大家作個Sample。沒有調試阿。 ------------------------------------------------------- As if Update(StudentID) begin Update BorrowRecord Set br.StudentID=i.StudentID From BorrowRecord br , Deleted d ,Inserted i Where br.StudentID=d.StudentID end 理解觸發器裡面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示......>>
請問資料庫 觸發器有什麼用
我就給你解釋一下實際場景吧
比如你有兩個表 A 和 B
A表有ID 和 NAME兩列
B表有ID,PLAY,NAMEID三列,A與B沒有關聯
如果你想刪除B表的內容,但是又同時想刪除A表中A.ID=B.NAMEID
那麼你就要寫兩條語句
如果使用觸發器
就只用寫刪除B表的內容語句,一旦刪除內容,則觸發器設定的表規則被觸發,那麼A表的相關內容也一起刪除了
SQL中觸發器有什麼作用
當你對表進行了添刪改查等操作時,如果你需要做一些特定的業務操作,就可以使用觸發器。
顧名思義,觸發,當你做了某種預設的操作時才會執行觸發器的命令
舉個例子。。
假設你有個員工基礎信息表,裡面有員工的身份證號碼,手機等基本信息。。
那麼,當你換了身份證或手機,需要修改號碼的時候,肯定是去修改員工的基礎資料表。
假設你現在有別的地方,比如人事檔案啊之類的,同樣使用了員工的手機等信息。。難道你還要再去修改一次檔案表么。。那麼如果還有其他地方使用了呢?
而觸發器就可以在這種時候做出判斷,如果修改了基礎表的信息,那麼就同步把其他使用了基礎表信息的地方也更改成最新的信息。。
大概就是這么個意思。。當然還有其他的作用
資料庫中替代觸發器的定義是什麼 5分
(1)DML觸發器:是指觸發器在資料庫中發生數據操作語言(DML)事件時將啟用。DML事件即指在表或視圖中修改數據的insert、update、delete語句也。 (2)DDL觸發器:是指當伺服器或資料庫中發生數據定義語言(DDL)事件時將啟用。DDL事件即指在表或索引中...
資料庫中的觸發器重點在什麼地方?
簡單來講哪就是事件觸發。
比如你對資料庫中的表進行了一個插刪等操作,你想在你即將做或者完成這個操作的時候程序能自動做一點別的工作,比如你想對插入數據檢查一下或者對刪除後的數據總數進行一下統計。
本來哪,你可以把這個工作寫在自己的程序里,就是把檢查寫在你插入動作之前或者把統計數目寫在刪除動作之後。這樣的問題是:你要做插刪的時候就都要寫這些代碼,而且很容易就遺漏了。
而觸發器哪,你定義在某個操作上,比如把那個檢查的工作過程定義成插入的前觸發器,把統計工作定義成後觸發器,那麼在你進行插入刪除的時候,資料庫那邊的程序就自動的給你做了這個工作了。
主要作用哪:我感覺
一是完整性(防止自己編程的遺漏),
二是簡單,
三是由資料庫程序(比如Oracle)進行這項工作,而不是由你自己的程序做,效率高。
下面是人家的一些教程,其實道理是很簡單的。你可以用它後面講的幾個資料庫的例子,自己寫一個,試試就知道了。
————————————————————————————————————————
一 觸發器介紹
觸發器是一種特殊的存儲過程,它在插入,刪除或修改特定表中
的數據時觸發執行,它比資料庫本身標準的功能有更精細和更復雜的
數據控制能力。資料庫觸發器有以下的作用:
* 安全性。可以基於資料庫的值使用戶具有操作資料庫的某種權
利。
# 可以基於時間限制用戶的操作,例如不允許下班後和節假日
修改資料庫數據。
# 可以基於資料庫中的數據限制用戶的操作,例如不允許股票
的價格的升幅一次超過10%。
* 審計。可以跟蹤用戶對資料庫的操作。
# 審計用戶操作資料庫的語句。
# 把用戶對資料庫的更新寫入審計表。
* 實現復雜的數據完整性規則。
# 實現非標準的數據完整性檢查和約束。觸發器可產生比規則
更為復雜的限制。與規則不同,觸發器可以引用列或資料庫對
象。例如,觸發器可回退任何企圖吃進超過自己保證金的期貨。
# 提供可變的預設值。
* 實現復雜的非標準的資料庫相關完整性規則。觸發器可以對數
據庫中相關的表進行連環更新。例如,在auths表author_code列上的
刪除觸發器可導致相應刪除在其它表中的與之匹配的行。
# 在修改或刪除時級聯修改或刪除其它表中的與之匹配的行。
# 在修改或刪除時把其它表中的與之匹配的行設成NULL值。
# 在修改或刪除時把其它表中的與之匹配的行級聯設成預設值。
# 觸發器能夠拒絕或回退那些破壞相關完整性的變化,取消試
圖進行數據更新的事務。當插入一個與其主健不匹配的外部鍵
時,這種觸發器會起作用。例如,可以在books.author_code
列上生成一個插入觸發器,如果新值與auths.author_code列
中的某值不匹配時,插入被回退。
* 同步實時地復製表中的數據。
* 自動計算數據值,如果數據的值達到了一定的要求,則進行特
定的處理。例如,如果公司的帳號上的資金低於5萬元則立即給財務人
員發送警告數據。
ORACLE與SYBASE資料庫的觸發器有一定的區別,下面將分別講述
這兩種資料庫觸發器的作用和寫法。
二 ORACLE 觸發器
ORACLE產生資料庫觸發器的語法為......>>
資料庫觸發器中new表和old表是什麼意思?
顧名思義,new是新插入的數據,old是原來的數據
insert只會有new,代表著要插入的新記錄
delete只會有old,代表著要刪除的記錄
update由於執行的是先刪除舊的記錄,再插入新的記錄,因此new和old都會有,且含義與上面的相同
SQL資料庫中的觸發器怎麼寫啊?急
CREATE TRIGGER trig_stu_update ON student
FOR UPDATE
AS
begin
end;
CREATE TRIGGER trig_stu_delete O功 student
FOR DELETE
AS
begin
end;
------------------
上面是更新、刪除的觸發器模板,將你的代碼填在begin...end之間。
觸發器中經常用到的inserted,deleted。
inserted裡面存放了insert、update操作的插入值或更新後值。
deleted里存放的是update、delete操作的更新前值或刪除值。
使用方法:
declare @no int,@sex bit,@age int;
--insert、update取新值
select @no=no,@sex=sex,@age=age from inserted;
--delete、update刪除值
select @no=no,@sex=sex,@age=age from deleted;
sql的觸發器是干什麼的,怎麼用?
觸發器的主要作用是,實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據一致性。
例如我們日常生活中常用的銀行存儲系統就應用了觸發器機制:當我們在銀行辦理存款或是取款業務後,系統除了會記錄我們的交易信息外,還會根據我們存入或取出的金額自動更新我們帳戶的余額(存款操作後增加帳戶余額,取款操作後減少帳戶余額),當操作中出現意外情況(如斷電),系統還會回滾我們所做的操作,以保證交易的完整性。
所以觸發器是在對表進行插入、更新和刪除操作時自動執行的存儲過程,同時它也具有事務的功能(整個操作要麼全部成功,要麼全部失敗)。
⑦ 觸發器 連接遠程資料庫怎麼寫
你的另一個帖子我回答了(http://..com/question/97929406.html )
1 強烈不建議用觸發器。觸發器用來最後一次檢查邏輯,rollback一下。或者記錄關鍵記錄刪除日誌是可以的。(防止多個系統業務混亂)。平時不要用。容易產生大量鎖並且導致效率低下。反正我是不用。
2 用觸發器修改的辦法參見另一個我回答的帖子
3 插入操作的觸發器大同小異。觸發條件改成after inserted.然後再去另一個表 select一下搭燃,看看是不是已經有重名的記錄了(這個會吧,exsit一下uid就行了)。如棗枝森果有 要麼 a刪除重建 b直接更新 c報錯,提示不能注冊。 這個跟你的業務策略有關,我實在是無法猜測你的需求去寫。總之代碼不復雜。關鍵是一個一個的去insert 或者去update.
4 上面的第三條還是有隱患的。因為可能會出現中途中斷。所以要加事物保障能夠一次性完成。失敗就rollback.這樣你可能會去寫大量的存儲過程。
5 經過上述操作,你會發現,你的資料庫會出現大量的鎖。你不得不去頻繁清理....
如果你堅持按照你的想法來,很可能就是這種結果
----------------------------------
我建議:
6 如果你是sql server.並且沒有跨庫。建立約束。至少把級聯刪除 級聯更新給勾上。用界面操作比你手寫sql要靠譜的多。因為ide會幫你檢查很多東西。
7 凡是論壇或者其他系統能注冊用戶的地方或者更新用戶信息的地方都屏蔽掉。不要讓他們去更新。你自己寫代碼接管這部分操作。比如另外寫一個aspx頁專門干這個。不然東一塊西一塊你幾乎無法管理
8 以上兩點達成後,開始寫CreateUser之類的sp.然後一個表一個表的插入用凳畝戶。插入前記得檢查下是不是原始庫裡面已經有了,如果有了,自動發簡訊給管理員查一下是怎麼回事(往message表插入一條數據會吧)。記得寫transaction,萬一有問題還能rollback
9 測試插入完成後。寫deleteUser updateUser 之類的sp,你會發現級聯更新無限美好。只修改主表記錄就行了,其他的跟著一起變。
希望能有所幫助。因為具體代碼要看你的業務系統(通常要調用其他業務系統的sp)。我只能做到這里了。
如果是在覺得麻煩,就花點錢讓熟悉那些業務系統的人幫你整合吧。如果天天出問題你用起來也是被它折磨。
⑧ 創建的觸發器帶有編譯錯誤
select table_sequence nextval into:new.id from al;
這句的table_sequence 和nextval 之間少禪如了個點
table_sequence.nextval
還有這賀攔啟個樣子些不好,這個al偽表一般只適合SQLPLUS下用衡逗,pl/sql中 直接用賦值的方式:
:new.id:=table_sequence.nextval就OK了。
⑨ DDL觸發器分為
在資料庫中有三種數據語言:
DDL(Data Definition Language):數據定義語言。如Create Drop Alter等
DML(Data Manipulation):數據操縱語言。如Insert ,Update,Delete
DCL(Data Control Language):數據控制語言 .如Grant,Revoke等
在2000中只可以為DML做觸發器,而在2005中,可以為DDL做觸發器,我們叫它DDL觸發器
一:
Microsoft SQL Server 2005 在資料庫引擎 中引入了多項能提高程序員的開發能力和工作效率的改進和新功能。其中DDL觸發器就是其中之一。
除了對修改數據的數據操作語言語句(INSERT、UPDATE 和 DELETE)所激發的觸發器提供支持外,資料庫引擎 還包括一類新的觸發器,由修神野改資料庫對象的 DDL 語句(如以 CREATE、ALTER 或 DROP 開頭的語句)激發。DDL 觸發器可用於審核或控制對資料庫架構的更改。
像常規觸發器一樣,DDL 觸發器將激發存儲過程以響應事件,這些語句做御主要是以 CREATE、ALTER 和 DROP 開頭的語句。DDL 觸發器可用於管理任務,例如審核和控制資料庫操作。
僅在運行觸發 DDL 觸發器的 DDL 語句後,DDL 觸發器才會激發。DDL 觸發器無法作為 INSTEAD OF 觸發器使用。
二:
在響應當前資料庫或伺服器中處理的 Transact-SQL 事件時,可以激發 DDL 觸發器。觸發器的作用域取決於事件。例如,每當資料庫中發生 CREATE TABLE 事件時,都會觸發為響應 CREATE TABLE 事件創建的 DDL 觸發器。每當伺服器中發生 CREATE LOGIN 事件時,都會觸發為響應 CREATE LOGIN 事件創建的 DDL 觸發器。
在下面的示例中,每當資料庫中發生 DROP TABLE 事件或 ALTER TABLE 事件,都將觸發 DDL 觸發器 safety:
CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'You must disable Trigger "safety" to drop or alter tables!'
ROLLBACK
;
資料庫范圍內的 DDL 觸發器都作為純瞎岩對象存儲在創建它們的資料庫中。可以在 master 資料庫中創建 DDL 觸發器,這些 DDL 觸發器的行為與在用戶設計的資料庫中創建的 DDL 觸發器一樣。可以從創建 DDL 觸發器的資料庫上下文中的 sys.triggers 目錄視圖中,或通過指定資料庫名稱作為標識符(例如 master.sys.triggers)來獲取有關這些 DDL 觸發器的信息。
伺服器范圍內的 DDL 觸發器作為對象存儲在 master 資料庫中。不同的是,可以從任何資料庫上下文中的 sys.server_triggers 目錄視圖中獲取有關資料庫范圍內的 DDL 觸發器的信息。
使用 EVENTDATA 函數,可以捕獲有關激發 DDL 觸發器的事件的信息。此函數返回 xml 值。
三:
以下示例創建用於存儲所有資料庫級事件的相關信息的表,並在表中填充 DDL 觸發器。通過對 EVENTDATA 生成的 XML 數據使用 XQuery,可以捕獲事件類型和 Transact-SQL 語句。
USE AdventureWorks;
GO
CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), TSQL nvarchar(2000));
GO
CREATE TRIGGER log
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @data XML
SET @data = EVENTDATA()
INSERT ddl_log
(PostTime, DB_User, Event, TSQL)
VALUES
(GETDATE(),
CONVERT(nvarchar(100), CURRENT_USER),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
GO
--Test the trigger.
CREATE TABLE TestTable (a int)
DROP TABLE TestTable ;
GO
SELECT * FROM ddl_log ;
GO
--Drop the trigger.
DROP TRIGGER log
ON DATABASE
GO
--Drop table ddl_log.
DROP TABLE ddl_log
GO
我是從「上海全鼎軟體學院」畢業的————————
⑩ Navicat Oracle創建觸發器成功但是編譯錯誤,怎麼解決
Oracle9i或以上版本的,要安裝冊扒Install Client11或以下;Oracle8或8i伺服器,需要安裝Install Client10或以下。這個問題不大,因為我們現斗氏在的Oracle都是10或11了,注意一下就好。
然後在Navicat中配置一下,選擇工具-選項
然後選擇左邊選項卡中的其他-OCI.
在OCI library中找到剛剛下載的文件夾中的oci.dll
這樣就完成了Navicat配置,也就使得Navicat中的oci.dll版本和Oracle中的版本一致了,必須重啟Navicat才能生效。這樣整州銷昌個配置就完成了。