Je veux créer un déclencheur avant suppression. Lorsque je supprime un enregistrement d'une table, cet enregistrement doit être inséré dans une table d'historique. Comment puis-je faire cela dans SQL Server?
Dans cette situation, il est probablement préférable de faire un déclencheur régulier «après». C'est l'approche la plus courante pour ce type de situation.
Quelque chose comme
CREATE TRIGGER TRG_AUD_DEL
ON yourTable
FOR DELETE
AS
INSERT INTO my_audit_table (col1, col2, ...)
SELECT col1, col2...
FROM DELETED
Ce qui se passera est que, lorsqu'un enregistrement (ou des enregistrements!) Est supprimé de votre table, la ligne supprimée est insérée dans my_audit_table
. La table DELETED
est une table virtuelle contenant les enregistrements tels qu'ils étaient juste avant la suppression.
Notez également que le déclencheur s'exécute dans le cadre de la transaction implicite sur l'instruction de suppression. Par conséquent, si votre suppression échoue et est annulée, le déclencheur est également annulé.
Vous pouvez également utiliser INSTEAD OF DELETE
CREATE TRIGGER dbo.SomeTableYouWhatToDeleteFrom
ON dbo.YourTable
INSTEAD OF DELETE
AS
BEGIN
-- Some code you want to do before delete
DELETE YourTable
FROM DELETED D
INNER JOIN dbo.YourTable T ON T.PK_1 = D.PK_1
END
Cela pourrait être fait en suivant les étapes pour, disons, dans cet exemple, j’utilise la table client:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
LAST_UPDATED DATETIME,
PRIMARY KEY (ID)
);
Créer une histoire:
CREATE TABLE CUSTOMERS_HIST(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
LAST_UPDATED DATETIME,
PRIMARY KEY (ID)
);
Déclenchez sur la table source comme ci-dessous lors de l'événement delete:
CREATE TRIGGER TRG_CUSTOMERS_DEL
ON CUSTOMERS
FOR DELETE
AS
INSERT INTO CUSTOMERS_HIST (ID, NAME, AGE, ADDRESS, LAST_UPDATED)
SELECT ID, NAME, AGE, ADDRESS, LAST_UPDATED
FROM DELETED