13


5

Déclencheur qui met à jour uniquement la ligne insérée

J’essaie de créer un déclencheur simple en utilisant TSQL (ou SQL Server 2008). Le problème est: mon déclencheur actuel met à jour la table entière. C’était bien pendant un moment, mais maintenant la table a plus de 20k lignes. Je veux donc un déclencheur qui ne met à jour que les lignes qui sont insérées.

Voici mon déclencheur simple actuel:

CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
FOR INSERT
AS
Begin
 Update Persons
    set MyFile = NULL
    where Len(MyFile) < 60
End

Je pense que je vais devoir utiliser la table "insérée" ou la fonction row_number commandée par la clé primaire. Des idées?

2 Answer


20


S’il est nécessaire d’utiliser un déclencheur ici, j’utiliserais un déclencheur INSTEAD OF pour ajuster les valeurs pré-insérées et éviter la nécessité de` JOIN 'sur la table de base et de les mettre à jour par la suite.

CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
INSTEAD OF INSERT
AS
  BEGIN
      INSERT INTO Persons
      SELECT foo,
             bar,
             CASE
               WHEN Len(MyFile) >= 60 THEN MyFile
             END
      FROM   Inserted
  END


16


Vous devez joindre la pseudo-table Inserted dans votre instruction` UPDATE`. Sachez toujours que SQL Server déclenche le déclencheur * une fois par instruction * et que cette instruction peut très bien modifier / insérer * plusieurs lignes * à la fois - de sorte que votre table Inserted contiendra probablement plus d’une ligne - il suffit de la garder à l’esprit lorsque vous écrivez votre déclencheur.

Essayez quelque chose comme ceci:

CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
FOR INSERT
AS
    UPDATE dbo.Persons
    SET MyFile = NULL
    WHERE Len(MyFile) < 60
    AND PersonID IN (SELECT DISTINCT PersonID FROM Inserted)

ou utilisez la colonne unique (votre clé primaire) dont vous disposez pour obtenir exactement les lignes qui ont été insérées.