INSTEAD OF UPDATE 觸發程序
您可以對檢視或資料表定義 INSTEAD OF UPDATE 觸發程序,以取代 UPDATE 陳述式的標準動作。通常,INSTEAD OF UPDATE 觸發程序會定義於檢視中,以修改一或多個基底資料表中的資料。
參考具 INSTEAD OF UPDATE 觸發程序的檢視之 UPDATE 陳述式,必須為 SET 子句中被參考的所有不可設為 Null 值之檢視資料行提供值。這包含參考基底資料表中資料行的檢視資料行 (該基底資料表的輸入值不能指定),如:
- 基底資料表中的計算資料行。
- 基底資料表中的識別資料行,其 IDENTITY INSERT 是設為 OFF。
- 具有 timestamp 資料類型的基底資料表資料行。
當參考資料表的 UPDATE 陳述式經常會嘗試設定計算、識別或 timestamp 資料行的值時,因為這些資料行的值必須由 SQL Server 2005 來決定,而產生錯誤。UPDATE 陳述式中必須包含這些資料行,以符合資料行的 NOT NULL 需求。但是,如果 UPDATE 陳述式引用含 INSTEAD OF UPDATE 觸發程序的檢視,在觸發程序中定義的邏輯可以繞過這些資料行,而避免錯誤。若要這樣做,INSTEAD OF UPDATE 觸發程序絕不能嘗試更新基底資料表中對應資料行的值。作法是 UPDATE 陳述式的 SET 子句中不能包括這些資料行。從 inserted 資料表處理資料錄時,計算、識別或 timestamp 資料行可以包含空的值,以符合 NOT NULL 資料行需求,但 INSTEAD OF UPDATE 觸發程序會忽略那些值,而由 SQL Server 設定正確的值。
此解決方式奏效的原因是,INSTEAD OF UPDATE 觸發程序不需要處理未更新的 inserted 資料行中的資料。在傳遞給 INSTEAD OF UPDATE 觸發程序的 inserted 資料表中,凡是在 SET 子句指定的資料行,都必須與 INSTEAD OF INSERT 觸發程序中的 inserted 資料行遵循相同的規則。至於未在 SET 子句中指定的資料行,inserted 資料表會包含在發出 UPDATE 陳述式之前就已經存在的值。觸發程序可以利用 IF UPDATE(column) 子句來測試特定資料行是否已經更新。如需詳細資訊,請參閱<INSTEAD OF INSERT 觸發程序>。
INSTEAD OF UPDATE 觸發程序只應在 WHERE 子句搜尋條件中,使用為計算、識別或 timestamp 資料行提供的值。
檢視上 INSTEAD OF UPDATE 觸發程序用來處理計算、識別、timestamp 或預設資料行提供之更新值的邏輯,會與套用到這些資料行之插入值的邏輯一樣。
![]() |
---|
使用 UPDATE 動作定義了外部索引鍵的資料表上,不能定義 INSTEAD OF UPDATE 觸發程序。 |