2017-01-11 1 views
0

Le déclencheur est supposé être annulé si l'instruction SELECT existe. La chose est, ce n'est pas le cas. Lorsque je lance uniquement le SELECT à partir du déclencheur, cela indique qu'une ligne existe. Mais quand j'essaye de SUPPRIMER avec les mêmes valeurs que j'ai dur codé dans le déclencheur, le déclencheur se déclenche mais il ne fait pas un retour en arrière. Quelqu'un a-t-il des idées sur ce qui pourrait être faux?sql Le déclencheur DELETE ne sera pas annulé

CREATE TRIGGER trg_del ON Projektbefattningar 

FOR DELETE 
AS 

    SELECT @befNr = Befattningsnr, @pNr = pNr, @EtappNr = Etappnr FROM deleted 
-- Not currently using these. Using hard coded values to illustrate my problem 

    IF EXISTS (
     SELECT * 
     FROM projektbefattningar 
     WHERE Befattningsnr = 2 AND pNr = 1 and Etappnr = 1 AND Anställningsnr is not null 
     ) 
    BEGIN 
     RAISERROR('Could not delete, Anställningsnr is not null', 16, 1) 
     --THROW 50001, 'Could not delete, Anställningsnr is not null', 1; 
     ROLLBACK TRANSACTION; 
    END 

GO 
+0

Pourquoi n'utilisez-vous pas un à la place du déclencheur? –

+0

Pourquoi les exceptions de lancement avant la restauration? Essayez d'abord de revenir en arrière. –

+0

Voir si cela aide. http://stackoverflow.com/questions/10072627/rollback-transaction-from-trigger –

Répondre

0

Essayez cette

CREATE TRIGGER trg_del ON Projektbefattningar 
FOR DELETE 
AS 
SELECT @befNr = Befattningsnr 
    ,@pNr = pNr 
    ,@EtappNr = Etappnr 
FROM deleted 

-- Not currently using these. Using hard coded values to illustrate my problem 
IF EXISTS (
     SELECT 1 
     FROM deleted 
     WHERE Befattningsnr = 2 
      AND pNr = 1 
      AND Etappnr = 1 
      AND Anställningsnr IS NOT NULL 
     ) 
BEGIN 
    RAISERROR (
      'Could not delete, Anställningsnr is not null' 
      ,16 
      ,1 
      ) 

    --THROW 50001, 'Could not delete, Anställningsnr is not null', 1; 
    ROLLBACK TRANSACTION; 
END 
GO 
+0

Cela a résolu mon problème! Merci – kukken

2

Lorsque vous utilisez pour SUPPRIMER vous considérez que ce TRIGGER tiré après la déclaration de suppression est terminée. Pour vérifier une condition avant DELETE, vous devez utiliser INSTEAD OF DELETE. Votre déclaration de déclenchement sera:

CREATE TRIGGER trg_del ON Projektbefattningar 
INSTEAD OF DELETE 
AS 

maintenant pour confirmer votre déclaration de suppression, vous devez inclure les supprimer alghouth il ne sera pas supprimé. La procédure finale sera comme ceci:

CREATE TRIGGER trg_del ON Projektbefattningar 

INSTEAD OF DELETE 
AS 

    SELECT @befNr = Befattningsnr, @pNr = pNr, @EtappNr = Etappnr FROM deleted 
-- Not currently using these. Using hard coded values to illustrate my problem 

    IF EXISTS (
     SELECT * 
     FROM projektbefattningar 
     WHERE Befattningsnr = 2 AND pNr = 1 and Etappnr = 1 AND Anställningsnr is not null 
     ) 
    BEGIN 
     RAISERROR('Could not delete, Anställningsnr is not null', 16, 1) 
     --THROW 50001, 'Could not delete, Anställningsnr is not null', 1; 
     ROLLBACK TRANSACTION; 
    END 
    ELSE 
    BEGIN 

     DELETE FROM YourTableToDelete Where idOfYourTable in (Select idOfYourTable from Deleted) 
    END 

GO 
+0

Aussi bonne solution au problème que j'ai eu avec les déclencheurs avant quand j'ai posé la question, sympa! Merci. De plus, INSTEAD OF DELETE ne fonctionne pas avec des clés étrangères, ce qui n'est pas si bon. – kukken