實作 DML 觸發程序

在建立 DML 觸發程序前,必須考量以下幾點:

  • CREATE TRIGGER 陳述式必須是批次中的第一個陳述式。跟隨在該批次之後的所有其他陳述式都會解譯為 CREATE TRIGGER 陳述式定義的一部分。

  • 擁有建立 DML 觸發程序的權限預設為該資料表的擁有者,並且無法將觸發程序傳送給其他使用者。

  • DML 觸發程序為資料庫物件,其名稱必須遵循識別碼的規則。

  • 雖然 DML 觸發程序能參考目前資料庫以外的物件,但卻只能在目前的資料庫中建立 DML 觸發程序。

  • 雖然 DML 觸發程序可以參考暫存資料表,不過卻不得在暫存或系統資料表上建立 DML 觸發程序。通常不應該參考系統資料表,不過可以使用資訊結構描述檢視來代替。

  • INSTEAD OF DELETE 與 INSTEAD OF UPDATE 觸發程序不能定義於以 DELETE 或 UPDATE 動作定義外部索引鍵的資料表。

  • 雖然 TRUNCATE TABLE 陳述式與不含 WHERE 子句的 DELETE 陳述式相同 (含 WHERE 子句將刪除整個資料列),但卻無法觸發 DELETE 觸發程序,因為尚未記錄 TRUNCATE TABLE 陳述式。

  • WRITETEXT 陳述式無法觸發 INSERT 或 UPDATE 觸發程序。

重要事項重要事項

從觸發程序傳回結果集的能力將會在未來版本的 SQL Server 中移除。傳回結果集的觸發程序可能會導致非專用的應用程式發生非預期的行為。請避免從新開發工作中的觸發程序傳回結果集,並計畫修改目前採用這種作法的應用程式。若要避免觸發程序在 SQL Server 中傳回結果集,請將 disallow results from triggers 選項 設為 1。在未來的 SQL Server 版本中,這個選項的預設值將會是 1。

當您建立 DML 觸發程序時,請指定:

  • 名稱

  • 定義觸發程序的資料表

  • 啟動觸發程序的時間。

  • 啟動觸發程序的資料修改陳述式。有效的選項為 INSERT、UPDATE 或 DELETE。多個資料修改陳述式可觸發同一個觸發程序。例如,可透過 INSERT 和 UPDATE 陳述式來啟用觸發程序。

  • 執行觸發程序動作的程式撰寫陳述式。

多個 DML 觸發程序

在同一資料表內可擁有多個 AFTER 觸發程序,且有不同的名稱;每一個觸發程序均可執行多個功能。雖然單一觸發程序可套用到三個使用者動作 (UPDATE,INSERT 和 DELETE) 的子集,但每一個觸發程序卻只能套用至同一個資料表中。

一個資料表只有一個特定類型的 INSTEAD OF 觸發程序。

觸發程序權限與擁有權

觸發程序會在定義這些觸發程序的資料表或檢視的結構描述中建立。例如,如果觸發程序 Trigger1 是在資料表 HumanResources.Employee 上建立,則符合結構描述的觸發程序名稱為 HumanResources.Trigger1

CREATE TRIGGER 的權限預設為定義觸發程序的資料表擁有者、系統管理員 (sysadmin) 固定伺服器角色,以及 db_ownerdb_ddladmin 固定資料庫角色的成員,並且不可轉移。

如果針對檢視建立 INSTEAD OF 觸發程序,當檢視的擁有者並未同時擁有檢視及觸發程序參考的基底資料表時,擁有權鏈結將會中斷。當檢視擁有者未擁有基底資料表時,資料表擁有者必須個別授予所需的權限給讀取或更新檢視的人。如果同一個使用者同時擁有檢視及基本基底資料表,則他們只能授予其他使用者檢視權限,而非個別的基底資料表。如需詳細資訊,請參閱<擁有權鏈結>。

若要建立觸發程序