2010-10-18 3 views
0

En tant qu'utilisateur avec peu ou pas d'expérience, je dois créer un trigger sur une table (ou trouver une autre solution). Ce qui doit être accompli, c'est que lorsque la valeur de la colonne ESB est changée en '1' dans une autre ligne du tableau, la colonne doit être mise à '0'.MS SQL 2005 AFTER UPDATE déclenche la mise à jour d'une autre ligne que la mise à jour

Mon intention était d'utiliser un déclencheur AFTER UPDATE, pour ce faire.

ALTER TRIGGER [TR_PHOTO_UPD] 
    ON [SOA].[dbo].[photos_TEST] 
    AFTER UPDATE 
AS 

DECLARE @ID VARCHAR(10) 
DECLARE @ESB VARCHAR(1) 

SELECT @ID = (SELECT TOP(1) ID 
     FROM SOA.dbo.photos_TEST 
       WHERE esb = 'Q' 
       ORDER BY ARRIVALDATETIME ASC) 
SELECT @ESB (SELECT esb FROM INSERTED) 


IF @ESB = '1' 
UPDATE SOA.dbo.photos_TEST SET esb = '0' WHERE ID = @I 

Ceci, comme vous le savez probablement, ne fonctionne pas, ni la définition du déclencheur suivant.

ALTER TRIGGER [TR_PHOTO_UPD] 
    ON [SOA].[dbo].[photos_TEST] 
    AFTER UPDATE 
AS 

DECLARE @ID VARCHAR(10) 
DECLARE @ESB VARCHAR(1) 

SELECT @ID = (SELECT TOP(1) ID 
     FROM SOA.dbo.photos_TEST 
       WHERE esb = 'Q' 
       ORDER BY ARRIVALDATETIME ASC) 
SELECT @ESB (SELECT esb FROM INSERTED) 


    IF @ESB = '1' 
    BEGIN 
    UPDATE SOA.dbo.photos_TEST 
    SET esb = '0' 
    WHERE id = (SELECT TOP(1) ID 
     FROM SOA.dbo.photos_TEST 
     WHERE esb = 'Q' 
     ORDER BY ARRIVALDATETIME ASC) 
    END 

Après plusieurs heures de googler et d'essayer je n'ai pas encore trouvé pourquoi la ligne n'est pas mis à jour « 0 ». Je soupçonne que la mise à jour dans un déclencheur AFTER UPDATE est la raison pour laquelle cela ne fonctionne pas. Est-ce que quelqu'un a des allusions ou mieux une solution?

Cheers,

Peter

+0

Il semble que vous souhaitiez que la ligne avec le dernier ID ajouté soit mise à jour chaque fois que la valeur 1 est insérée dans la colonne ESB, n'est-ce pas? –

+0

Oui, exactement. Si une ligne est ajoutée, la valeur de ESB est 'Q'. Le déclencheur doit définir la valeur d'une ligne sur "0". Après cela, un adaptateur de base de données traite les données et modifie la valeur de 0-> R (eserved) -> 1 (traité). S'il y a des lignes avec ESB = 'Q', une ligne (la plus ancienne à la date d'arrivée) doit être mise à 0 pour lancer le traitement. – pcvnes

Répondre

1

Ces deux approches ne fonctionneront pas lorsqu'ils traitent avec plusieurs mises à jour. Pourquoi avez-vous même besoin de le faire au cas par cas?

Ne pouvez-vous pas simplement exécuter une mise à jour à travers la table de toute façon.

Peut-être que quelque chose le long des lignes de:

If Update(ESB) 
    begin 

     Update a 
     Set AnotherColumn = 0 
     From YourTable a 
     Join inserted ins on a.Id = ins.Id 
     Where ins.ESB = 1 

    end 

Cela permet de vérifier pour voir si elle était la colonne qui a été mis à jour ESB. Si elle était alors il exécute l'instruction de mise à jour pour définir AnotherColumn à zéro lorsque la valeur est 1

ESB

Je pense que cela devrait fonctionner pour vous

+0

Salut Barry, non ça ne marche pas; Mettre à jour un Set a.esb = 0 De SOA.dbo.photos_TEST un Inscrivez-ins insérés sur a.Id = ins.Id Où ins.ESB = 1 Le déclencheur de mise à jour ci-dessus se traduit par une « La valeur de la ligne (s) mis à jour ou effacés ne rendent pas la rangée unique ou modifient plusieurs rangées (2 rangées) – pcvnes

+0

@pcvnes - Votre table 'photos_TEST' a-t-elle des clefs primaires ou avez-vous des lignes en double? – codingbadger

+0

@pcvnes - ajoutez aussi SET NOCOUNT ON au début de la définition de votre déclencheur – codingbadger

0

Merci à l'aide de Barry si finalisé la gâchette;

CREATE TRIGGER TR_PHOTO_AU 
    ON   SOA.dbo.photos 
    AFTER  UPDATE 
AS 

DECLARE @MAXCONC INT -- Maximum concurrent processes 
DECLARE @CONC INT  -- Actual concurrent processes 

SET @MAXCONC = 1  -- 1 concurrent process 

-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON 

-- If column esb is involved in the update, does not necessarily mean 
-- that the column itself is updated 
If (Update(ESB)) 
BEGIN 
    -- If column esb has been changed to 1 
    IF ((SELECT esb FROM INSERTED) = '1') 
    BEGIN 
     -- count the number of (imminent) active processes 
     SET @CONC = (SELECT COUNT(*) 
        FROM SOA.dbo.photos pc 
        WHERE pc.esb in ('0','R')) 

     -- if maximum has not been reached 
     IF NOT (@CONC >= @MAXCONC) 
     BEGIN 
      -- set additional rows esb to '0' to match @MAXCONC 
       UPDATE TOP(@[email protected]) p2 
       SET p2.esb = '0' 
      FROM (SELECT TOP(@[email protected]) p1.esb 
        FROM SOA.dbo.photos p1 
        WHERE p1.esb = 'Q' 
        ORDER BY p1.arrivaldatetime ASC 

      ) p2 

     END 
    END 
END 
Questions connexes