當前位置:成語大全網 - 書法字典 - SQL觸發器編寫

SQL觸發器編寫

樓主的語法是基於orcale的吧?sql server2000中沒有before、for each row和new in trigger等關鍵字。下面寫了壹個,可以實現妳的功能,不知道有沒有更好的寫法。期待更好....

如果存在(select * from sysobjects,其中name='Insert_Or_Update_sal ')

刪除觸發器Insert_Or_Update_sal

創建觸發器Insert_Or_Update_sal

論教師

對於插入,更新

如同

開始

聲明@job char(8),@sal numeric(7,2),@eno numeric(4)

- inserted是用於插入或更新的臨時表。請參考下面的幫助。

select @eno=eno,@job=job,@sal=sal from inserted

如果@job=' professor '和@ sal

更新教師集sal=4000,其中eno=@eno

-下面兩句可能也能完成這個功能,但性能較低。

-如果存在(select * from inserted where job = ' professor ' and sal

-更新教師集sal = 4000,其中job =“professor”和sal

結束

以下是sql server2000幫助文檔中關於trigger的部分,希望對妳有所幫助。

-

創建觸發器

創建壹個觸發器,這是壹個特殊的存儲過程,當用戶試圖對指定的表執行指定的數據修改語句時,會自動執行該過程。微軟?SQL Server?允許為任何給定的INSERT、UPDATE或DELETE語句創建多個觸發器。

語法

創建觸發器trigger_name

在{表格|視圖}上

[帶加密]

{

{ { FOR | AFTER | INSTEAD OF } { [插入] [,] [更新] }

[帶追加]

[不用於復制]

如同

[ {如果更新(列)

[ {和|或}更新(列)]

[...n ]

| IF(COLUMNS _ UPDATED(){ bitwise _ operator } UPDATED _ bit mask)

{比較_運算符}列_位掩碼[...n ]

} ]

sql_statement [...n ]

}

}

參數

觸發器名稱

觸發器的名稱。觸發器名稱必須符合標識符規則,並且在數據庫中必須是唯壹的。您可以選擇是否指定觸發器所有者名稱。

表格|視圖

是在其上執行觸發器的表或視圖,有時稱為觸發器表或觸發器視圖。您可以選擇是否指定表或視圖的所有者名稱。

帶加密

加密syscomments表中包含CREATE TRIGGER語句文本的條目。使用WITH ENCRYPTION可防止觸發器作為SQL Server復制的壹部分發布。

在...之後

指定只有在trigger SQL語句中指定的所有操作都已成功執行後才觸發觸發器。在執行此觸發器之前,還必須成功完成所有引用級聯操作和約束檢查。

如果只指定了FOR關鍵字,則AFTER是默認設置。

不能在視圖上定義AFTER觸發器。

代替

指定執行觸發器而不是觸發器SQL語句,從而替換觸發器語句的操作。

在表或視圖中,每個INSERT、UPDATE或DELETE語句最多只能定義壹個INSTEAD OF觸發器。但是,您可以在每個具有INSTEAD OF觸發器的視圖上定義視圖。

不能在帶有CHECK選項的可更新視圖上定義INSTEAD OF觸發器。如果向指定了WITH CHECK選項的可更新視圖添加INSTEAD OF觸發器,SQL Server將生成錯誤。用戶必須使用ALTER VIEW刪除此選項,然後才能定義INSTEAD OF觸發器。

{[刪除] [,] [插入][,][更新] }

是壹個關鍵字,指定在表或視圖上執行時,哪些數據修改語句將激活觸發器。您必須至少指定壹個選項。這些關鍵字在觸發器定義中允許以任何順序出現。如果指定了多個選項,請用逗號分隔它們。

對於INSTEAD OF觸發器,在具有ON DELETE級聯操作引用的表上不允許使用DELETE選項。同樣,對於引用關系為ON UPDATE cascade operation的表,不允許使用UPDATE選項。

帶附加

指定應添加現有類型的其他觸發器。僅當兼容級別為65或更低時,才需要此可選子句。如果兼容級別為70或更高,則沒有必要使用WITH APPEND子句添加現有類型的其他觸發器(這是兼容級別設置為70或更高的CREATE TRIGGER的默認行為)。有關更多信息,請參見sp_dbcmptlevel。

WITH APPEND不能與INSTEAD OF trigger壹起使用,或者如果顯式聲明了AFTER trigger,則不能使用此子句。只有在為了向後兼容而指定FOR時,才能使用WITH APPEND(沒有INSTEAD OF或AFTER)。未來版本將不支持WITH APPEND和FOR(將被解釋為AFTER)。

不用於復制

指示當復制進程更改觸發器中涉及的表時,不應執行觸發器。

如同

是觸發器要執行的操作。

sql _語句

是觸發器的條件和操作。觸發條件指定其他標準來確定DELETE、INSERT或UPDATE語句是否會導致觸發操作。

當嘗試刪除、插入或更新操作時,Transact-SQL語句中指定的觸發器操作將生效。

觸發器可以包含任意數量和種類的Transact-SQL語句。觸發器被設計成根據數據修改語句來檢查或改變數據;它不應該向用戶返回數據。觸發器中的Transact-SQL語句通常包含控制流語言。CREATE TRIGGER語句中使用了幾個特殊的表:

刪除和插入的是邏輯(概念)表。這些表在結構上類似於定義觸發器的表(即嘗試用戶操作的表);這些表用於存儲可能被用戶操作更改的行的舊值或新值。例如,要檢索已刪除表中的所有值,請使用:

選擇*

從已刪除

如果兼容級別等於70,SQL Server將不允許在delete、insert或UPDATE觸發器中引用INSERTed和DELETEd表中的text、ntext或image列。無法訪問插入和刪除的表中的Text、ntext和image值。若要在INSERT或UPDATE觸發器中檢索新值,請將插入的表與原始更新表聯接起來。當兼容級別為65或更低時,在插入或刪除的表中允許空值的text、ntext或image列將返回空值。如果這些列不能為空,則返回零長度字符串。

當兼容級別為80或更高時,SQL Server允許通過INSTEAD OF觸發器更新表或視圖中的text、ntext或image列。

n

是壹個占位符,指示觸發器可以包含多個Transact-SQL語句。對於IF UPDATE (column)語句,可以通過重復UPDATE (column)子句來包含多個列。

如果更新(列)

測試對指定列的插入或更新操作,該操作不能用於刪除操作。可以指定多個列。因為表名是在ON子句中指定的,所以在IF UPDATE子句中,不要在列名之前包含表名。若要測試對多個列的插入或更新操作,請在第壹個操作後指定壹個單獨的UPDATE(column)子句。IF UPDATE將在插入操作中返回TRUE值,因為這些列插入顯式值或隱式(NULL)值。

解釋IF UPDATE (column)子句的功能等同於IF,IF...ELSE或WHILE語句,並且可以使用BEGIN...END語句塊。有關更多信息,請參見控制流語言。

您可以在觸發器主體的任何地方使用UPDATE (column)。

圓柱

要測試插入或更新操作的列的名稱。該列可以是SQL Server支持的任何數據類型。但是,計算列不能在這種環境中使用。有關更多信息,請參見數據類型。

IF (COLUMNS_UPDATED())

測試所提到的列是否已被插入或更新,並且僅在插入或更新觸發器中使用。COLUMNS_UPDATED返回varbinary位模式,指示表中插入或更新了哪些列。

COLUMNS_UPDATED函數從左到右返回位,最低有效位在左邊。最左邊的位代表表中的第壹列;右邊的下壹位表示第二列,依此類推。如果在表上創建的觸發器包含8個以上的列,COLUMNS_UPDATED將返回多個字節,最左邊的字節最不重要。在插入操作中,COLUMNS_UPDATED將為所有列返回TRUE值,因為這些列插入了顯式值或隱式(NULL)值。

您可以在觸發器主體的任何地方使用COLUMNS_UPDATED。

按位運算符

是用於比較運算的位運算符。

updated _位掩碼

表示實際更新或插入的列的整數位掩碼。例如,表t1包含列C1、C2、C3、C4和C5。假設表t1上有壹個更新觸發器。若要檢查C2、C3和C4列是否都已更新,請指定值14。若要檢查是否只更新了列C2,請將值指定為2。

比較_運算符

是壹個比較運算符。使用等號(=)檢查updated_bitmask中指定的所有列是否都已實際更新。使用大於號(> )檢查updated_bitmask中指定的任何或某些列是否已被更新。

列_位掩碼

是要檢查的列的整數位掩碼,用於檢查這些列是否已被更新或插入。

給…作註解

觸發器通常用於實施業務規則和數據完整性。SQL Server通過表創建語句(ALTER TABLE和CREATE TABLE)提供聲明性參照完整性(DRI);但是,DRI不提供數據庫之間的引用完整性。要實施參照完整性(關於表的主鍵和外鍵之間關系的規則),請使用主鍵和外鍵約束(ALTER TABLE和CREATE TABLE的主鍵和外鍵關鍵字)。如果觸發器表中有約束,則在INSTEAD OF觸發器執行之後和觸發器執行之前檢查這些約束。如果違反了約束,INSTEAD OF觸發器操作將回滾,並且不會執行(觸發)AFTER觸發器。

可以使用sp_settriggerorder來指定表上第壹個和最後壹個執行的AFTER觸發器。對於表上的每個插入、更新和刪除操作,只能為第壹次執行和最後壹次執行指定壹個AFTER觸發器。如果在同壹個表上有其他AFTER觸發器,它們將以隨機順序執行。

如果ALTER TRIGGER語句更改了第壹個或最後壹個觸發器,則修改後的觸發器上的第壹個或最後壹個功能集將被刪除,排序值必須用sp_settriggerorder重置。

只有在成功執行觸發SQL語句(包括所有與更新或刪除的對象相關聯的引用級聯操作和約束檢查)後,才會執行AFTER觸發器。AFTER trigger檢查trigger語句的運行效果,以及由trigger語句引起的更新和刪除引用的所有級聯操作的效果。

觸發極限

CREATE TRIGGER必須是批處理中的第壹條語句,並且只能應用於壹個表。

只能在當前數據庫中創建觸發器,但是觸發器可以引用當前數據庫中的外部對象。

如果指定觸發器所有者名稱來限定觸發器,則以同樣的方式限定表名。

在同壹個CREATE TRIGGER語句中,可以為多個用戶操作定義同壹個觸發器操作,如INSERT和UPDATE。

如果表的外鍵在刪除/更新操作上定義了cascade,則不能在表上定義INSTEAD OF DELETE/UPDATE觸發器。

可以在觸發器中指定任何SET語句。所選的SET選項在觸發器執行期間有效,並在觸發器執行後恢復到以前的設置。

與存儲過程壹樣,當觸發器觸發時,結果將返回給調用應用程序。為了避免由於觸發器觸發而向應用程序返回結果,請不要在觸發器中包含返回結果的SELECT語句或分配變量的語句。包含向用戶返回結果的SELECT語句或分配變量的語句的觸發器需要特殊處理;這些返回的結果必須寫入每個允許修改觸發器表的應用程序中。如果必須在觸發器中進行變量賦值,則應該在觸發器的開頭使用SET NOCOUNT語句,以避免返回任何結果集。

DELETE觸發器無法捕獲TRUNCATE TABLE語句。雖然TRUNCATE TABLE語句實際上是壹個沒有WHERE子句的DELETE語句(它刪除所有行),但是它沒有日誌記錄,因此不能執行觸發器。因為TRUNCATE TABLE語句的權限是默認授予表所有者的,並且是不可轉移的,所以只有表所有者需要考慮無意中使用TRUNCATE TABLE語句來規避DELETE觸發器的問題。

無論是否記錄日誌,WRITETEXT語句都不會激活觸發器。

妳能解決妳的問題嗎?