在大量匯入資料時,控制觸發程序的執行
「觸發程序」是一種特殊形式的預存程序,當使用者修改資料表或檢視中的資料時,就會自動執行。執行觸發程序會影響大量匯入作業的效能。例如,每當有記錄匯入,就傳送電子郵件訊息,這種觸發程序會降低大量匯入作業的速度,而且會導致電子郵件一團混亂。
在大量匯入資料時,您可以控制大量匯入作業是否要執行 (「引發」) 觸發程序。應該只有在資料表含有支援多重資料列插入的 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 的大小,以減緩觸發程式對於版本存放區的影響。如需詳細資訊,請參閱<資料列版本控制資源的使用方式>。