星期五, 11月 08, 2013

[SQL] 大量匯入與 Trigger 觸發

有三種大量匯入資料方式,分別為
  1. BCP
  2. BULK INSERT
  3. INSERT ...SELECT * FROM OPENROWSET(BULK...)
這三種大量匯入進行時對於 Trigger 的影響有所差異,整理在下面表格

大量匯入預設行為限定詞限定詞類別
BCP停用-h " FIRE_TRIGGERS "提示
BULK INSERT停用FIRE_TRIGGERS引數
INSERT ...SELECT * FROM OPENROWSET(BULK...)觸發WITH(IGNORE_TRIGGERS)資料表提示


BULK INSERT 觸發 Trigger Demo

建立 BulkTrigger 和 BulkTriggerTime 兩個 Table 並在 BulkTrigger 上建立 triBulkTrigger Trigger,當有資料 INSERT 進 BulkTrigger 時來觀察 Trigger 是否被觸發,進而把資料 INSERT 進入 BulkTriggerTime 內。
  • Sample Data
USE TempDB
GO

IF OBJECT_ID('TempDB..BulkTrigger') IS NOT NULL DROP TABLE TempDB..BulkTrigger
IF OBJECT_ID('TempDB..BulkTriggerTime') IS NOT NULL DROP TABLE TempDB..BulkTriggerTime
IF OBJECT_ID('TempDB..triBulkTrigger') IS NOT NULL DROP TABLE TempDB..triBulkTrigger

CREATE TABLE BulkTrigger (ROWNO char(10))
CREATE TABLE BulkTriggerTime (ROWNO char(10) , insertTime datetime)
INSERT INTO BulkTrigger VALUES('001')
INSERT INTO BulkTrigger VALUES('002')
INSERT INTO BulkTrigger VALUES('003')
GO

CREATE TRIGGER triBulkTrigger
   ON TempDB.dbo.BulkTrigger
   AFTER INSERT
AS 
    BEGIN
  
        INSERT INTO BulkTriggerTime (ROWNO , InsertTime)
        SELECT ROWNO , GETDATE()
        FROM inserted

    END
GO
  • 利用 BULK INSERT 把資料 INSERT 進入 BulkTrigger Table
BULK INSERT TempDB.dbo.BulkTrigger
FROM 'C:\BulkTrigger.txt'

SELECT * FROM BulkTrigger
SELECT * FROM BulkTriggerTime
[SQL] 大量匯入與 Trigger 觸發-1
  • 利用 BULK INSERT 並指定 FIRE_TRIGGERS 把資料 INSERT 進入 BulkTrigger Table
BULK INSERT TempDB.dbo.BulkTrigger
FROM 'C:\BulkTrigger.txt'
WITH ( FIRE_TRIGGERS ) -- 指定 FIRE_TRIGGERS 

SELECT * FROM BulkTrigger
SELECT * FROM BulkTriggerTime
[SQL] 大量匯入與 Trigger 觸發-2

沒有留言:

張貼留言