Frage

ich einen Trigger in einer Tabelle in SQL Server 2000 haben, ist dies der Auslöser:

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 Auslöser genannt wird, aber es hält viele, viele Datensätze auf Table_History einfügen.

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

Vielen Dank im Voraus =)

War es hilfreich?

Lösung

Trigger gesetzt basiert, so tun
  IF (@area = 'L') wird nur auf dem ersten Datensatz aus der eingefügten Tabelle suchen. 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 bemerkt, dass Sie die Top (1), Qualifier ausgiebig genutzt haben. Wenn es mehr als eine Zeile zurückgibt, dann wird es mehr als eine Zeile in die History-Tabelle eingefügt werden.

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

    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 deaktivieren rekursiv für die gesamte Datenbank Auslösen, da es sich um eine Datenbank-Option ist.

Andere Tipps

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top