Comportement du déclencheur d'insertion impaire de SQL Server 2000 - Récursif, comme

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

  •  03-07-2019
  •  | 
  •  

Question

J'ai un déclencheur dans une table dans SQL Server 2000, il s'agit du déclencheur:

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

Maintenant, lorsqu'ils insèrent un enregistrement dans "Tables", le déclencheur est appelé mais il continue d'insérer de nombreux enregistrements dans Table_History.

J'ai parlé avec mes pairs et il semble qu'il n'y ait rien qui cloche! = S Des indices à ce sujet? Est-ce que je fais quelque chose de mal?

Merci d'avance =)

Était-ce utile?

La solution

Les déclencheurs sont définis en fonction, donc faire
   IF (@area = 'L') ne regardera que le premier enregistrement de la table insérée. Essayez d’ajouter le chèque dans votre clause 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'

Êtes-vous sûr que l'instruction Select principale ne renvoie que la ligne? J'ai remarqué que vous avez largement utilisé le qualificatif Top (1). S'il renvoie plus d'une ligne, plusieurs lignes seront insérées dans votre table d'historique.

Peut-être en aveugle, essayez de placer un Top (1) pour le choix le plus à l'extérieur:

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

Sinon, il semble que vous ayez une certaine récursion dans le déclencheur. Je ne le vois pas, mais si vous le souhaitez, vous pouvez désactiver le déclenchement récursif pour toute la base de données, car il s'agit d'une option de base de données.

Autres conseils

Existe-t-il un autre déclencheur dans la table Table_History qui s'insère dans les tables?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top