Énumérer les plusieurs lignes dans un déclencheur multi-mise à jour

Nov 19 2020

J'ai quelque chose comme le tableau ci-dessous:

CREATE TABLE updates (
    id INT PRIMARY KEY IDENTITY (1, 1),
    name VARCHAR (50) NOT NULL,
    updated DATETIME
);

Et je le mets à jour comme ceci:

INSERT INTO updates (name, updated)
VALUES
    ('fred', '2020-11-11),
    ('fred', '2020-11-11'),
    ...
    ('bert', '2020-11-11');

J'ai besoin d'écrire un déclencheur de mise à jour après et d'énumérer tous les noms qui ont été ajoutés et d'ajouter chacun à une autre table mais je ne peux pas déterminer comment énumérer chacun.

EDIT: - grâce à ceux qui m'ont orienté dans la bonne direction, je connais très peu SQL.

Ce que je dois faire est quelque chose comme ça

  • foreach nom inséré
  • recherchez-le dans une autre table et
  • récupérer un décompte des mises à jour effectuées par un 'nom'
  • ajouter 1 au décompte
  • et mettez-le à jour dans l'autre table

Je ne peux pas accéder à mon ordinateur portable pour le moment, mais je peux probablement faire quelque chose comme:

BEGIN
  SET @count = (SELECT UCount from OTHERTAB WHERE name = ins.name)
  SET @count = @count + 1
  UPDATE OTHERTAB SET UCount = @count WHERE name = ins.name
  SELECT ins.name
  FROM inserted ins;
END

et cela fonctionnerait pour chaque nom dans la mise à jour?

Évidemment, je vais devoir lire sur le traitement SQL basé sur les ensembles.

Merci à tous pour l'aide et les conseils.

Réponses

LukaszSzozda Nov 19 2020 at 20:13

Utilisation d'une insertedapproche basée sur des ensembles (pas besoin de boucle):

CREATE TRIGGER trg
ON updates
AFTER INSERT
AS
BEGIN
  INSERT INTO tab2(name)
  SELECT name
  FROM inserted;
END
DaleK Nov 19 2020 at 21:04

Sur la base de vos modifications, vous feriez quelque chose comme ce qui suit ... basé sur un ensemble est un état d'esprit, vous n'avez donc pas besoin de calculer le décompte à l'avance (en fait, vous ne pouvez pas). Il n'est pas clair si vous comptez dans la même table ou dans une autre table - mais je suis sûr que vous pouvez y arriver.

Points:

  • Utilisez le tableau Inséré pour déterminer les lignes à mettre à jour
  • Utilisez une sous-requête pour calculer la nouvelle valeur s'il s'agit d'une deuxième table, en tenant compte de la possibilité de null

Si vous utilisez vraiment la même table, cela devrait fonctionner

BEGIN
    UPDATE OTHERTAB SET
      UCount = COALESCE(UCount,0) + 1 
    WHERE [name] in (
        SELECT I.[name]
        FROM Inserted I
    );
END;

Si toutefois vous utilisez une deuxième table, cela devrait fonctionner:

BEGIN
    UPDATE OTHERTAB SET
      UCount = COALESCE((SELECT UCount+1 from OTHERTAB T2 WHERE T2.[name] = OTHERTAB.[name]),0) 
    WHERE [name] in (
        SELECT I.[name]
        FROM Inserted I
    );
END;