102 messaggi dal 26 agosto 2009
Quando creo un Trigger ... After Delete agisce dopo avere cancellato
il record nella tabella.

Esiste la possibilità di creare un Trigger Before Delete??

(anche perchè io dovrei eliminare dei record all'interno di un'altra tabella
in cui ho un constraint 'Foreign Key' riferito appunto alla tabella in cui
applico il Trigger!)
994 messaggi dal 19 dicembre 2003
Contributi | Blog
Puoi utilizzare un trigger di tipo INSTEAD OF nel corpo del quale catturi, dalla pseudo tabella DELETED, i criteri per cancellare i record sulla tabella correlata. In alternativa puoi utilizzare le azioni CASCADE dei vincoli FK.

Bye

Luca Bianchi
Microsoft MVP - SQL Server
102 messaggi dal 26 agosto 2009
Ok, grazie mille!
Però in tutte le documentazioni è scritto:
I trigger INSTEAD OF DELETE e INSTEAD OF UPDATE non possono essere definiti in una tabella contenente una chiave esterna definita utilizzando un'operazione di propagazione DELETE o UPDATE.

Quindi penso non si possa fare con la prima strada, anche se non ho provato..
Proverò la seconda.
994 messaggi dal 19 dicembre 2003
Contributi | Blog
Però in tutte le documentazioni è scritto:
I trigger INSTEAD OF DELETE e INSTEAD OF UPDATE non possono essere definiti in una tabella contenente una chiave esterna definita utilizzando un'operazione di propagazione DELETE o UPDATE.


E questo mi pare ovvio. Quello che a te credo non sia altrettanto ovvio è che una "operazione di propagazione di DELETE o UPDATE" altro non è che quello che ti ho proposto come alternativa, ovvero utilizzare l'opzione CASCADE.

Quindi penso non si possa fare con la prima strada,


Dando per scontato che la seconda strada non l'hai implementata (altrimenti non staresti qui a chiedere) la prima è sicuramente percorribile. Segui questo esempio

CREATE TABLE dbo.T1
(
id smallint not null,
c1 varchar(20) not null,
CONSTRAINT PK_T1 PRIMARY KEY (id)
);
GO

CREATE TABLE dbo.T2
(
id smallint not null,
id_T1 smallint not null,
c1 varchar(20) not null,
CONSTRAINT FK_T1 FOREIGN KEY (id_T1) REFERENCES dbo.T1 (id)
);
GO

INSERT dbo.T1 VALUES (1, 'Luca');
INSERT dbo.T2 VALUES (1, 1, 'Luca');
GO

CREATE TRIGGER tr_T1_del ON dbo.T1
INSTEAD OF DELETE
AS

DELETE dbo.T2
WHERE id_T1 IN (SELECT id FROM DELETED)

DELETE dbo.T1
WHERE id IN (SELECT id FROM DELETED)
GO

DELETE T1 WHERE id = 1;
GO

SELECT * FROM dbo.T1;
SELECT * FROM dbo.T2;
GO

Convinto adesso? :-)

Luca Bianchi
Microsoft MVP - SQL Server
102 messaggi dal 26 agosto 2009
Ora sono convinto!!
Quindi quando faccio una Delete sulla tabella T1, scatta prima il Trigger che
va ad eliminare i record sulla tabella T2 (con la FK associata al record
della T1 che sto eliminando) e poi elimina il Record sulla Tabella T1.
L'ho appena provato: funziona correttamente!
In pratica quando tento di fare un'operazione di Delete, questa operazione
non viene fatta e scatta il Trigger.
Magari poteva sembrare tutto banale, ma su Google nessuno aveva questa soluzione.. e le risposte rimanevano in bianco.
Grazie mille!!
Modificato da claudiomarchetti il 08 aprile 2010 11.31 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.