Comportamento del trigger di inserimento dispari di SQL Server 2000 & # 8212; Mi piace ricorsivo

StackOverflow https://stackoverflow.com/questions/613447

  •  03-07-2019
  •  | 
  •  

Domanda

Ho un trigger in una tabella in SQL Server 2000, questo è il trigger:

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

Ora, quando inseriscono un record in " Tabelle " ;, viene chiamato il trigger, ma continua a inserire molti, molti record su Table_History.

Ho parlato con i miei colleghi e sembra che non ci sia nulla di sbagliato! = S Qualche idea su questo? Sto facendo qualcosa di sbagliato?

Grazie in anticipo =)

È stato utile?

Soluzione

I trigger sono impostati in base, quindi facendo
   IF (@area = 'L') guarderà solo il primo record dalla tabella inserita. Prova ad aggiungere il segno di spunta come parte della tua clausola WHERE:

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'

Sei sicuro che l'istruzione Select principale restituisca solo una riga? Ho notato che hai utilizzato ampiamente il qualificatore Top (1). Se restituisce più di una riga, nella tabella della cronologia verranno inserite più righe.

Forse come tiro alla cieca, prova a inserire una Top (1) per la selezione più esterna:

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

Altrimenti sembra che tu abbia una ricorsione in corso nel trigger. Non riesco a vederlo, ma se vuoi, puoi disattivare il trigger ricorsivo per l'intero database, poiché è un'opzione di database.

Altri suggerimenti

Esiste un altro trigger nella tabella Table_History che viene inserito nelle tabelle?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top