web-dev-qa-db-fra.com

SQL Server: déclencheur pour Supprimer

Je souhaite créer un déclencheur, qui ne signifie pas Supprimer un client si son nom est Peter. Comment puis je faire ça?

CREATE TRIGGER trgCUSTOMER ON customer
FOR DELETE
AS
BEGIN
    IF (SELECT name FROM deleted) not like 'Peter'
    BEGIN
        delete from customer where name = (select name from deleted);
    END
END;
1
sarah

Vous avez deux options:

1) Rollback Le supprimer au cas où vous supprimez la ligne "Peter". Vous faites cela avec un après déclenchement. Sachez qu'il rentraînera toute la transaction dans l'affaire Yuo're supprimant plusieurs rangées parmi lesquelles au moins une est "Peter".

CREATE TRIGGER TR_CUSTOMER_DEL ON customer
FOR DELETE
AS
BEGIN

    SET NOCOUNT ON;

    IF EXISTS (
        SELECT *
        FROM deleted
        WHERE name = 'Peter'
    )
    BEGIN
        ROLLBACK;
        THROW 50001, 'Cannot delete Peter', 1;
    END
END;

2) Vous remplacez la manière dont SQL Server supprime sur la table, à l'aide d'un fichier à la gâchette. Dans ce cas, vous ignorez silencieusement les suppressions pour la ligne "Peter".

CREATE TRIGGER TR_CUSTOMER_IO_DEL ON customer
INSTEAD OF DELETE
AS
BEGIN

    SET NOCOUNT ON;

    DELETE c
    FROM customer AS c
    INNER JOIN deleted AS d
        ON c.customer_id = d.customer_id
    WHERE d.name <> 'Peter';

END;

Lequel est le mieux pour vous dépend fortement de votre logique commerciale.

5
spaghettidba

Ce déclencheur a fonctionné.

CREATE TRIGGER trgCustomer ON customer
INSTEAD OF DELETE
AS
BEGIN
    SET NOCOUNT ON
    DELETE 
    FROM customer
        WHERE customer.ID IN (Select ID from deleted where name != 'Peter')
END;
0
sarah