Udate sequenziale di tabelle relazionate con vincolo integrita'

mercoledì 11 novembre 2015 - 13.46
Tag Elenco Tags  Windows Server 2008 R2  |  SQL Server 2008 R2

skraus Profilo | Junior Member

Salve,
ho due tabelle in Sql Server 2008 R2. La tabella A e' composta di tre campi idUtente, idProgetto e anno che formano una chiave composta.

In questa tabella devo eseguire l'update del campo idProgetto.

La tabella B, relazionata con A, e' composta di 6 campi idRisultato (Pk), idUtente (Fk), idProgetto (Fk)(Fk), anno (Fk)(Fk), idSoglia (Fk), dataInsert.

In questa tabella devo eseguire l'update del campo idSoglia.

I campi idProgetto ed anno sono campi di chiave esterna assieme all'idSoglia in una relazione con una tabella C.

Attualmente, sia che eseguo un update singolo sulla tabella A, sia che eseguo un update di join tra A e B, mi si genera un errore per il vincolo esistente tra B e C. Ossia quando vado a variare il valore del campo idProgetto sulla tabella A, l'integrita' referenziale lo propaga sulla tabella B, ma a quel punto viene sollevata l'eccezione in quanto il valore del campo idSoglia non soddisfa piu' il vincolo con la tabella C.

E' fattibile uscirne senza modificare i vincoli? (credo di no, ma forse mi sbaglio), in generale sono graditi consigli.

Grazie a tutti
Sk

renarig Profilo | Expert

>E' fattibile uscirne senza modificare i vincoli?

Si

Non mi è chiara la struttura della tabella C
ricapitolo quello che ho capito

___ A
idUtente ----- Numerico --- PK
idProgetto --- Numerico --- PK
anno --------- Numerico --- PK


___ C
idProgetto --- Numerico --- PK
anno --------- Numerico --- PK
idSiglia ----- Numerico --- PK


___ B
idRisultato -- Numerico --- PK
idUtente ----- Numerico --- fk con A
idProgetto --- Numerico --- fk con A e C
anno --------- Numerico --- PK con A e C
idSiglia ----- Numerico --- PK con C
dataInsert --- Data

Vuoi modificare il campo idProgetto in A
( e per deduzione anche in B e C )

immaginiamo che il 22 vuoi farlo diventare 220
allora con 5 query di comando a catena potresti farlo
tieni presente che è una procedura "pesante"
che oltre a UPDATARE deve fare anche INSERT e DELETE

NB: Testato su Access(ino) ma ritengo che
ti funziona tranquillamente anche su SQLServer

magari 2 variabili e una Stored che ti fa tutto insieme ......

INSERT INTO A ( idUtente, idProgetto, anno ) SELECT A.idUtente, 220 AS xxx, A.anno FROM A WHERE (A.idProgetto=22); INSERT INTO C ( idProgetto, anno, idSoglia ) SELECT 220 AS xxx, C.anno, C.idSoglia FROM C WHERE (C.idProgetto=22); UPDATE B SET B.idProgetto = 220 WHERE (B.idProgetto=22); DELETE * FROM A WHERE (A.idProgetto=22); DELETE * FROM C WHERE (C.idProgetto=22);

Poi: .........
Vuoi modificare il campo idSoglia in B
Vediamo prima se puo andare bene quanto sopra


Facci sapere

skraus Profilo | Junior Member

la relazione tra A e B e tra C e B e' uno a molti, ossia a e C sono relazionate molti a molti, per tanto la struttura da te rappresentata nel post di risposta e' errata, ossia i campi di chiave esterna, come avevo scritto in origine, idProgetto ed anno della tabella b sono campi di chiave esterna sia della tabella A che della tabella C.

Il problema che avevo (la soluzione che ho adottato e' simile a quella da te proposta) era di aggiornare il campo idProgetto della tabella A. In precedenza eseguendo l'update sulla tabella A, veniva innescato l'aggiornamento a catena dei campi di chiave esterna correlati (tabella B), cio' produceva una combinazione di valori inconsistente per il vincolo tra le tabelle C e B e per tanto veniva sollevata una eccezione.

Al momento ho risolto cosi', senza alterare i vincoli tra le tabelle. Per prima cosa eseguo un delete sulla tabella B, di tutti i record che sarebbero interessati dall'aggiornamento a caduta derivante dall'update della tabella A, poi eseguo l'update del record della tabella A ed infine l'insert dei nuovi record nella tabella B, il tutto all'interno di una transazione.

Grazie comunque per il suggerimento.

Ciao
Sk
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