Pergunta

Eu tenho um gatilho em uma tabela no SQL Server 2000, este é o gatilho:

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

Agora, quando inserir um registro em "Tabelas", o gatilho é chamado, mas ele mantém a inserção de muitos, muitos registros em Table_History.

Eu falei com os meus colegas e não parece que não há nada de errado! = S nenhuma pista sobre isso? Estou fazendo algo errado?

Agradecemos antecipadamente =)

Foi útil?

Solução

Os gatilhos são definidos com base, de modo a fazer
IF (@area = 'L') só olhar para o primeiro registro da tabela inserida. Tente adicionar o cheque como parte de sua cláusula 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'

Você tem certeza de que a principal instrução Select só faz retornar a uma linha? Tenho notado que você tenha usado o qualificador Top (1) extensivamente. Se ela retorna mais de uma linha, em seguida, haverá mais de uma linha inserida na sua tabela de histórico.

Talvez como um tiro cego, tente colocar em um Top (1) para o mais externo, selecione:

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

Caso contrário, parece que você tem algum recursão acontecendo no gatilho. Eu não posso vê-lo, mas se você quiser, você pode desligar recursiva desencadeante para toda a base de dados, uma vez que é uma opção de banco de dados.

Outras dicas

Existe outra gatilhos na tabela isso é Table_History inserção em tabelas?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top