11 messaggi dal 27 aprile 2004
Salve a tutti, avrei un problemino con SQL Server:

Ho bisogno di fare delle UPDATE in cascata, utilizzando ON UPDATE CASCADE, poichè ho diverse tabelle correlate.

Il mio problema è che tali update sono possibili solo se sono definite delle relazioni tra le tabelle, e questo non è il problema vero e proprio perchè tali relazioni esistono, ma se voglio l'aggiornamento di due tabelle correlate quando modifico un valore che non è la PK della tabella padre ovviamente non riesco a propagare alla tabella correlata la modifica.

Forse sono stato un pò contorto, quindi porto un esempio:

ho due tabelle:
- Clienti e Attivita

La relazione che le lega è : FK_Attivita_Clienti dove in Clienti la PK è ID e in Attivita la FK è ClienteID

In Clienti e anche in Attivita ho due colonne simili: OperatoreID che non è PK per nessuna delle due.

Il punto è, se cambio in alcuni record della tabella Clienti l'OperatoreID, vorrei che la modifica si propagasse anche in Attivita.

Come posso fare? Sempre se è possibile.

Grazie a tutti in anticipo,
Massimo.
823 messaggi dal 05 agosto 2002
Il modo corretto sarebbe avere una tabella operatore, con in chiave l'operatore_id e nelle tue due tabelle una fk che punta a tale campo.
In questo modo aggiornando l'operatore_id nella tabella degli operatori (il posto giusto per farlo) con la clausola on update cascade si otterrebbe l'effetto voluto.

Stick to your guns.
Formazione su MySQL o Firebird? Contattami!
11 messaggi dal 27 aprile 2004
Ciao,

ti ringrazio per la celere risposta ma sfortunatamente non risolve il mio problema, poichè ho già una tabella operatori dove la PK è l'ID, e non posso modificare tale ID.
In Clienti e Attivita esiste la colonna OperatoreID poichè un cliente è associato ad un operatore, Relazione FK_Clienti_Operatori con PK = ID in Operatori e FK = OperatoreID in Clienti.
Inoltre ad un cliente sono associate una o più attività, relazione FK_Attivita_Clienti con PK = ID in Clienti e FK = ClienteID in Attivita, e la tabella Attivita ha anche la colonna OperatoreID.

Quello che desidero ottenere è che se cambio l'OperatoreID in Clienti, per associare il cliente ad un altro operatore, vorrei che il cambiamento si riflettesse anche nella tabella Attivita.

Grazie.
Ciao,
Massimo.
823 messaggi dal 05 agosto 2002
Se l'operatore della tabella attività dipende sempre e solo da quello del cliente puoi cambiare la constraint in questo senso:
FK da cliente a operatore su id_operatore garantisce che al cliente venga attribuito un operatore esistente
FK da attività a cliente su id_operatore fà si che all'attività sia assegnato solo un operatore già assegnato a clienti

Stick to your guns.
Formazione su MySQL o Firebird? Contattami!
11 messaggi dal 27 aprile 2004
Ciao,

forse non ho capito bene.

Nella tabella attivita ho tutte le attività di tutti gli operatori.

Una situazione tipo è la seguente:

Tabella Operatori:
ID 1
ID 2
ID 3

Tabella Clienti:
ID 10 OperatoreID 1
ID 11 OperatoreID 1
ID 12 OperatoreID 1
ID 13 OperatoreID 2
ID 14 OperatoreID 2
ID 15 OperatoreID 3
ID 16 OperatoreID 3

Tabella Attivita
ID 219 ClienteID 10 OperatoreID 1
ID 225 ClienteID 10 OperatoreID 1
ID 342 ClienteID 10 OperatoreID 1
ID 297 ClienteID 11 OperatoreID 2
ID 298 ClienteID 11 OperatoreID 2
ID 207 ClienteID 12 OperatoreID 3
ID 398 ClienteID 12 OperatoreID 3
ID 399 ClienteID 12 OperatoreID 3

e vorrei, cambiando l'OperatoreID in Clienti che la modifica si riflettesse anche su Attivita, in modo tale da poter assegnare un cliente ad un altro operatore.

Per una DELETE non ho problemi, ed infatti eliminando un operatore dalla tabella Operatori mi elimina tutti i clienti ad esso associati nella tabella Clienti e tutte le attività di tutti i clienti associati a tale operatore.

Grazie.
Ciao,
Massimo.
823 messaggi dal 05 agosto 2002
La domanda è:
l'operatore della tabella attività dipende sempre e solo da quello del cliente?

Stick to your guns.
Formazione su MySQL o Firebird? Contattami!
11 messaggi dal 27 aprile 2004
Ciao,
scusa il ritardo ma sono scappato ieri sera!

Ho pensato che in considerazione del fatto che dovendo aggiornare molte tabelle in seguito alla modifica dell'OperatoreID per un cliente potrei utilizzare un trigger in seguito all'update.

Però a questo punto ho un'altra domanda:

come posso memorizzare, per poi utilizzare nel trigger l'OperatoreID "vecchio" e quello "nuovo"?

La situazione è:
in seguito ad un' update dell'OperatoreID in tabella Clienti parte il trigger che:
fa un'update dell'OperatoreID per tutti i Clienti legati a quello per il quale è stato fatto l'update, che sono ad esso legati con il ParentID. Quindi mi serve il valore vecchio per reperire tali vip e quello nuovo per aggiornare anche a loro l'OperatoreID.

Ad es:

Tabella Clienti
ID = 1 ParentID = NULL OperatoreID = 20
ID = 2 ParentID = 1 OperatoreID = 20
ID = 3 ParentID = 1 OperatoreID = 20
ID = 4 ParentID = NULL OperatoreID = 20
ID = 5 ParentID = 4 OperatoreID = 20

Vorrei che in seguito a UPDATE Clienti SET OperatoreID = 50 WHERE OperatoreID = 20 AND ParentID = NULL

il trigger facesse:

UPDATE Clienti SET OperatoreID = "nuovo valore" WHERE OperatoreID = "vecchio valore" AND ParentID = "id del cliente che ha subito l'update"

Lo so che sembra stupido mettere ..AND ParentID = "id del cliente che ha subito l'update" visto che se elimino ...AND ParentID = NULL dal'update mi fa l'update per tutti quelli che mi servono ma è solo un esempio poichè devo fare poi delle update in altre tabelle, ciò che mi serve sono nuovo e vecchio valore dell' OperatoreID.

Grazie,
ciao,
Massimo.
823 messaggi dal 05 agosto 2002
I valori vecchio e nuovo sono riportati nativamente nel trigger, con le pseudotabelle inserted e deleted.
Leggi questo:
If a trigger is started as a result of an UPDATE statement, the deleted

pseudotable will contain all rows that match the WHERE clause of the

update, with all data as it was BEFORE the update; the inserted

pseudotable will contain the same rows as they appear AFTER applying the

SET clause of the update. If the UPDATE statement changed the value of the

primary key column(s) (which is unfortunately allowed in SQL Server), it

can be quite hard to find out which row in inserted matches which row in

deleted. (da http://www.eggheadcafe.com/ng/microsoft.public.sqlserver.msde/post218076.asp)

Stick to your guns.
Formazione su MySQL o Firebird? Contattami!

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.