2017-05-06 2 views
1

Ich mache einen Fehler irgendwo aber kann nicht herausfinden.SQL Server-Trigger Einfügen von ganzen Tabellenzeilen, anstatt von neuen

Szenario ist dies: Immer wenn eine neue Zeile in der Tabelle 'TestTrigger' eingefügt wird, sollte die Tabelle TriggerInsert eine Wert Erfassungszeit erhalten, wenn eine neue Zeile in TestTrigger eingefügt wurde.

Das Problem ist, wenn der Trigger trifft, anstatt nur eine neue Zeile, wird die gesamte Tabelle jedes Mal in TestTrigger neu befüllt. Ich möchte nur die neuen Zeilen erfassen, nicht die gesamte Tabelle wird bei jedem Trigger eingefügt.

Hier ist mein Trigger:

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 

Bitte helfen, wo ich falsch werde.

+0

Welches Datenbanksystem verwenden Sie? Die Syntax variiert zwischen ihnen und es ist nicht möglich zu sagen, ob Ihre Syntax korrekt ist oder nicht. – DigiFriend

+0

Verwenden von SQL Server 2012 –

Antwort

1

Wenn man sich nur die Zeilen aussehen soll, die eingefügt wurden, müssen Sie die Inserted Pseudo-Tabelle verwenden - nicht die dbo.TestTrigger Basistabelle ....

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

Vielen Dank, es funktioniert. Obwohl es mir immer noch unklar ist, was macht die eingefügte Tabelle? –

+0

@ IrfaanWahid: Die 'Inserted'-Pseudo-Tabelle enthält ** die Zeilen, die ** durch die Anweisung eingefügt wurden, die diesen Auslöser ausgelöst hat. [Lesen Sie mehr dazu bei Microsoft Docs] (https://docs.microsoft.com/en-us/sql/relational-databases/triggers/use-the-inserted-and-deleted-tables) –

+0

Danke, verstanden. –

1

Ihre SELECT-Abfrage zurückgibt alle Zeilen aus Ihrer Quellentabelle (TestTrigger). Verwenden Sie stattdessen die Tabelle eingefügt. Es enthält nur die Zeilen, die in TestTrigger eingefügt werden, und nicht alle Zeilen, die Sie gerade erhalten.

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