2017-05-06 41 views
1

我在某處犯了一個錯誤,但無法弄清楚。SQL Server觸發器插入整個表的行,而不是新的

場景是這樣的: 每當在表'TestTrigger'中插入一個新行時,在TestTrigger中插入一個新行時,表TriggerInsert應該獲得一個值捕獲時間。

問題是,無論何時觸發命中,而不是隻是一個新行,整個表都會在TestTrigger中每次都重新填充。我只想捕獲新行,而不是將整個表插入到每個觸發器上。

這裏是我的觸發器:

USE [irfaan] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER Trigger [dbo].[InsertTriggerTest] on [irfaan].[dbo].[TestTrigger] 
--For Insert 
After insert 
as 
INSERT into TriggerInsert (CurrTime, IOFNum) SELECT (GetDate()), SONum FROM TestTrigger 

請幫助我要去的地方錯了。

+0

你在使用什麼數據庫系統?它們之間的語法不盡相同,無法判斷您的語法是否正確。 – DigiFriend

+0

使用SQL Server 2012 –

回答

1

如果你想看看剛插入的行,你必須使用Inserted僞代碼表 - dbo.TestTrigger基表....

ALTER TRIGGER dbo.InsertTriggerTest 
ON irfaan.dbo.TestTrigger 
FOR INSERT 
AS 
    INSERT INTO TriggerInsert (CurrTime, IOFNum) 
     SELECT GETDATE(), SONum 
     FROM Inserted 
+0

非常感謝,它的工作原理。儘管對我而言仍然不清楚,但插入表格有什麼作用? –

+0

@IrfaanWahid:'Inserted'僞表包含導致此觸發器被觸發的語句插入**的那些行。 [閱讀更多關於它在微軟文檔](https://docs.microsoft.com/en-us/sql/relational-databases/triggers/use-the-inserted-and-deleted-tables) –

+0

謝謝,理解。 –

1

你的SELECT查詢返回的所有行從您的源表(TestTrigger)。改用表代替。它只包含正在插入到TestTrigger中的行,而不是您正在獲取的所有行。

INSERT into TriggerInsert (CurrTime, IOFNum) SELECT (GetDate()), SONum FROM Inserted