Trigger di aggiornamento

martedì 01 agosto 2006 - 13.00

paolopat Profilo | Junior Member

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 ?

lbenaglia Profilo | Guru

>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 ?

Che DBMS stai utilizzando?


--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

us01739 Profilo | Expert

Ciao, giusto per avere un'idea sui trigger e sui campi modoficati, puoi dai un'occhiata a questo post
http://www.dotnethell.it/forum/messages.aspx?ThreadID=9214

Bye
---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

paolopat Profilo | Junior Member

uso SQL Server 2000

lbenaglia Profilo | Guru

>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

paolopat Profilo | Junior Member

mi sono spiegato male......elimino la riga dalla parte uno e metto a zero un campo relativo alle righe della parte molti...cmq ho risolto grazie alla tabella deleted...non ne conoscevo l'esistenza...grazie a tutti

ecco il mio trigger :

/*
** Trigger che viene eseguito nel momento in cui si cancella un modello di nota.
** Esso fa in modo che per tutti i modelli di domanda che hanno un riferimento
** a quest'ultimo, tale riferimento venga posto a 0
*/
CREATE TRIGGER [aggiornaNote] ON [dbo].[ModNota]
FOR DELETE
AS
DECLARE @idModNota INT
SELECT @idModNota = idModNota FROM deleted
UPDATE ModDomanda SET idModNota = 0 WHERE idModNota = @idModNota
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5