如果存在(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語句都不會激活觸發器。
妳能解決妳的問題嗎?