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;
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.
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;