在大量匯入資料時,控制觸發程序的執行

「觸發程序」是一種特殊形式的預存程序,當使用者修改資料表或檢視中的資料時,就會自動執行。執行觸發程序會影響大量匯入作業的效能。例如,每當有記錄匯入,就傳送電子郵件訊息,這種觸發程序會降低大量匯入作業的速度,而且會導致電子郵件一團混亂。

在大量匯入資料時,您可以控制大量匯入作業是否要執行 (「引發」) 觸發程序。應該只有在資料表含有支援多重資料列插入的 INSERT 及 INSTEAD OF 觸發程序時,大量匯入作業才執行觸發程序。如需這些觸發程序的詳細資訊,請參閱<DML 觸發程序>。

重要事項重要事項

停用觸發程序時,可能會採用結構描述修改鎖定來更新中繼資料。這可能會影響其他命令 (例如線上索引建立) 或交易。例如,存取目標資料表的快照集隔離交易,可能會因為同時執行的 DDL 變更而失敗。

若啟用觸發程序,就會針對每個批次各執行一次。

在大量匯入作業期間,其行為取決於用於作業的命令。根據預設,bcp 命令和 BULK INSERT (Transact-SQL) 陳述式會停用觸發程序。相反地,若是 INSERT ...SELECT * FROM OPENROWSET(BULK...) 陳述式,預設會執行觸發程序。

下表簡單說明預設的行為。

大量匯入命令

預設行為

bcp

停用觸發程序

BULK INSERT

停用觸發程序

INSERT ...SELECT * FROM OPENROWSET(BULK...)

執行觸發程序

每個大量匯入命令都會提供一個限定詞,可讓您變更控制觸發程序的方式,說明請見以下各章節。

以 bcp 或 BULK INSERT 來執行觸發程序

根據預設,bcp 命令和 BULK INSERT 陳述式不會執行觸發程序。但是您可以使用下列限定詞來啟用觸發程序:

命令

限定詞

限定詞類型

bcp

-h"FIRE_TRIGGERS"

提示

BULK INSERT

FIRE_TRIGGERS

引數

如果在大量匯入作業中指定 FIRE_TRIGGERS,就會執行在資料表上定義的任何 INSERT 及 INSTEAD OF 觸發程序,以將所有資料列插入資料表。

如需詳細資訊,請參閱<bcp 公用程式>與<BULK INSERT (Transact-SQL)>。

停用 INSERT ...SELECT * FROM OPENROWSET(BULK...) 中的觸發程序

根據預設,OPENROWSET 大量資料列集提供者會執行觸發程序。但是您可以使用下列限定詞來停用觸發程序:

命令

限定詞

限定詞類型

INSERT ...SELECT * FROM OPENROWSET(BULK...)

WITH(IGNORE_TRIGGERS)

資料表提示

若指定此提示,OPENROWSET 大量資料列集提供者就不會執行觸發程序。如需有關 IGNORE_TRIGGERS 提示的詳細資訊,請參閱<資料表提示 (Transact-SQL)>。

在啟用觸發程序的情況下匯入大型批次

SQL Server 2005 及更新的版本會使用觸發程序的資料列版本控制,並將資料列版本儲存在 tempdb 中的版本存放區。使用觸發程序大量匯入大型批次的資料記錄之前,可能需要增加 tempdb 的大小,以減緩觸發程式對於版本存放區的影響。如需詳細資訊,請參閱<資料列版本控制資源的使用方式>。