匯入大容量資料時控制觸發器執行

iSQlServer發表於2008-11-26

“觸發器”是一種特殊形式的儲存過程,它在使用者修改表中或檢視中的資料時自動執行。執行觸發器會影響大容量匯入操作的效能。例如,每次匯入記錄時就傳送電子郵件的觸發器會降低大容量匯入操作的速度並建立一些電子郵件。

大容量匯入資料時,您可以控制大容量匯入操作是否執行(觸發)觸發器。大容量匯入操作應只對包含支援多行插入的 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 的大小以適應觸發器對版本儲存區的影響,才能使用觸發器大容量匯入大批資料記錄。有關詳細資訊,請參閱行版本控制資源的使用情況。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-503399/,如需轉載,請註明出處,否則將追究法律責任。

相關文章