>Ciao a tutti, è la prima volta che creo un trigger e vorrei un
>consiglio. In pratica, ho una tabella che ha un campo id che
>è chiave esterna di un'altra tabella. Vorrei che cancellando
>una riga di quest'ultima, in tutte le righe della prima tabella
>venisse messo a zero l'id suddetto. E' possibile ricavere l'id
>di una riga eliminata ?
In SQL Server 2000 non è possibile definire un constraint FOREIGN KEY che in caso si UPDATE/DELETE permetta di assegnare un certo valore alla FK, mentre SQL Server 2005 lo può fare tramite l'opzione SET DEFAULT, quindi l'unica possibilità è quella di ricorrere ai triggers.
Dato che i triggers di tipo after scattano successivamente alle modifiche, non è possibile definire constraint FOREIGN KEY.
Inoltre quello che scrivi penso che sia errato: "ho una tabella che ha un campo id che è chiave esterna di un'altra tabella. Vorrei che cancellando una riga di quest'ultima, in tutte le righe della prima tabella venisse messo a zero l'id suddetto".
Sembra che vorresti fare in modo che eliminando una sola riga delle n possibili nella tabella dalla parte molti della relazione venisse azzerarato il corrispondente ID nella tabella dalla parte 1.
Questa operazione genererebbe n-1 righe orfane.
L'esempio che ti sto per proporre utilizza un after trigger di delete per porre a 0 gli ID di tutte le righe della tabella dalla parte molti della relazione quando elimini la riga corrispondente nella tabella dalla parte 1.
USE tempdb;
GO
CREATE TABLE dbo.Pazienti(
PazienteID int NOT NULL PRIMARY KEY,
Nome varchar(10) NOT NULL,
Cognome varchar(10) NOT NULL
);
GO
CREATE TABLE dbo.Esami(
EsameID int NOT NULL PRIMARY KEY,
PazienteID int NOT NULL,
Esame varchar(20) NOT NULL,
Data datetime NOT NULL
);
GO
CREATE TRIGGER dbo.trD_Pazienti
ON dbo.Pazienti
FOR DELETE
AS
UPDATE dbo.Esami
SET PazienteID = 0
FROM DELETED AS D
JOIN dbo.Esami AS E
ON D.PazienteID = E.PazienteID
GO
INSERT dbo.Pazienti VALUES(1, 'Lorenzo', 'Benaglia');
INSERT dbo.Pazienti VALUES(2, 'Luca', 'Bianchi');
INSERT dbo.Pazienti VALUES(3, 'Andrea', 'Montnari');
INSERT dbo.Pazienti VALUES(4, 'Gianluca', 'Hotz');
INSERT dbo.Esami VALUES(1, 1, 'Esame1', '20060101');
INSERT dbo.Esami VALUES(2, 1, 'Esame2', '20060201');
INSERT dbo.Esami VALUES(3, 1, 'Esame3', '20060301');
INSERT dbo.Esami VALUES(4, 2, 'Esame4', '20060101');
INSERT dbo.Esami VALUES(5, 2, 'Esame5', '20060201');
INSERT dbo.Esami VALUES(6, 3, 'Esame6', '20060101');
INSERT dbo.Esami VALUES(7, 3, 'Esame7', '20060201');
INSERT dbo.Esami VALUES(8, 3, 'Esame8', '20060301');
INSERT dbo.Esami VALUES(9, 3, 'Esame9', '20060401');
GO
/* Elimino il paziente Lorenzo */
DELETE dbo.Pazienti
WHERE Nome = 'Lorenzo';
GO
SELECT *
FROM dbo.Esami;
GO
/* Output:
EsameID PazienteID Esame Data
----------- ----------- -------------------- -----------------------
1 0 Esame1 2006-01-01 00:00:00.000
2 0 Esame2 2006-02-01 00:00:00.000
3 0 Esame3 2006-03-01 00:00:00.000
4 2 Esame4 2006-01-01 00:00:00.000
5 2 Esame5 2006-02-01 00:00:00.000
6 3 Esame6 2006-01-01 00:00:00.000
7 3 Esame7 2006-02-01 00:00:00.000
8 3 Esame8 2006-03-01 00:00:00.000
9 3 Esame9 2006-04-01 00:00:00.000
(9 row(s) affected)
*/
/* Pulizia */
DROP TABLE dbo.Esami, dbo.Pazienti;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org