2009-03-05 5 views
0

ich einen Trigger in einer Tabelle in SQL Server 2000 haben, ist dies der Auslöser:SQL Server 2000 Odd Insert Trigger-Verhalten - rekursive Wie

ALTER Trigger [dbo].[Set_Asignado_State] ON [dbo].[Tables] 
FOR INSERT AS 
BEGIN   
    DECLARE @area varchar(1) 
    SELECT @area = Table_Area_ID FROM inserted 

    IF (@area = 'L') 
    BEGIN 
     INSERT INTO Table_History 
     SELECT (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AS Table_Area_Id, 
       (SELECT SUBSTRING(CAST(YEAR(GETDATE()) AS VARCHAR), 3, 2)) AS Table_Year, 
       (SELECT TOP 1 Table_Seq AS Table_Seq FROM inserted) AS Table_Seq, 
       (SELECT TOP 1 ID FROM Table_Status WHERE Description = 'Asignado') AS Status, 
       '' AS Responsible, 
       (SELECT TOP 1 OrigDept FROM inserted) AS User_Responsible, 
       GETDATE() AS [DateTime], 
       'None' AS Comments 
     FROM Tables 
     WHERE Tables.Table_Area_Id = (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AND 
       Tables.Table_Year = (SELECT SUBSTRING(CAST(YEAR(GETDATE()) AS VARCHAR), 3, 2)) 

     IF @@ERROR <> 0 
     BEGIN 
      DECLARE @errorMsg NVARCHAR(256) 
      SET @errorMsg = @@ERROR; 

      PRINT 'Error Inserting in Table_History' 

     END 
    END 
END 

Nun, wenn sie einen Datensatz in "Tabellen" einzufügen, Der Trigger wird aufgerufen, aber er fügt viele, viele Datensätze in Table_History ein.

Ich habe mit meinen Kollegen gesprochen und es scheint, dass nichts falsch ist! = S Irgendwelche Hinweise dazu? Mache ich etwas falsch?

Vielen Dank im Voraus =)

+0

@Hugo: vielleicht könnten Sie in Worten erklären, was es tun soll? –

+0

läuft mit einer Schere ... – dkretz

+0

Einverstanden, aber wenn jemand laufen möchte, sollten wir in der Lage sein, ihnen zu helfen, die möglichen Nebenwirkungen zu minimieren –

Antwort

0

Trigger basieren gesetzt, so
tun IF (@area = 'L') sieht nur auf den ersten Datensatz aus der Tabelle eingefügt. Versuchen Sie, die Prüfung als Teil Ihrer WHERE-Klausel:

WHERE Tables.Table_Area_Id = (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AND 
       Tables.Table_Year = (SELECT SUBSTRING(CAST(YEAR(GETDATE()) AS VARCHAR), 3, 2)) 
AND SUBSTRING(Tables.Table_Area_Id, 1, 1) = 'L' 

Sind Sie sicher, dass die Haupt-Select-Anweisung nur die eine Zeile zurückgibt? Ich habe festgestellt, dass Sie den Top (1) Qualifier weitgehend verwendet haben. Wenn es mehr als eine Zeile zurückgibt, wird mehr als eine Zeile in Ihre Verlaufstabelle eingefügt.

Vielleicht als blinder Schuss, versuchen Sie in einem Top (1) für die äußerste select setzen:

INSERT INTO Table_History 
    SELECT TOP(1) (SELECT TOP 1 ... 

Ansonsten sieht es aus, als ob Sie einige Rekursion los in dem Trigger haben. Ich kann es nicht sehen, aber wenn Sie möchten, können Sie die rekursive Triggerung für die gesamte Datenbank ausschalten, da es sich um eine Datenbankoption handelt.

+0

Sorry für die späte Antwort, ich musste aber eine andere Sache beheben, die eine höhere Priorität bekommen hat, ich werde das testen und euch wissen lassen, dass das passiert, aber ich denke, das wird die Antwort sein. Danke nochmal mann =) – Hugo

+0

Es hat Anthony funktioniert! Vielen Dank Alter! =) – Hugo

0

Gibt es einen anderen Auslöser auf den Table_History Tisch, das ist in den Tabellen einfügen?