Cambio chiave primaria e aggiornamento relazione

di il
4 risposte

Cambio chiave primaria e aggiornamento relazione

Volendo aggiornare il mio db sviluppato nell'arco di 10 anni e iniziato quando le conoscenze erano molto limitate mi trovo a dover rimediare a errori di gioventù.....
Mi trovo in questa situazione:
-In una tabella (clienti) cambio la chiave primaria. Inserisco il nuovo campo chiave IDClienti (contatore)
-Questa tabella (clienti) e' collegata con diverse relazioni ad altre tabelle tramite il vecchio campo chiave.
-Cancello la veccha relazione e inserisco la nuova facendo ovviamente riferimento alla nuova chiave (IDClienti) e inserendo un nuovo campo nelle tabelle collegate alla Clienti.
-Le tabelle collegate ovviamente nel nuovo campo presentano solo valori nulli.

Onde evitare di scrivere una routine ad hoc per ogni tabella che vada a riempire il nuovo campo, c'e' un sistema più veloce?

4 Risposte

  • Re: Cambio chiave primaria e aggiornamento relazione

    Non ci sono scorciatoie.

    La routine da scrivere tuttavia credo possa essere solo 1... se la scrivi in modo intelligente...!
    Devi partire dal punto che hai sempre 2 Tabelle una lato 1 ed una lato Molti.

    La prima cosa da fare è AGGIUNGERE i campi NUOVI sia come PK(lato1) che come FK(latoM) e saranno come PK Counter e si aggiornerà da solo, mentre nella Tabella lato M, dovrai farlo via codice... ma facendo riferimento alla HOLD_PK...

    Il lavoro pertanto è da fare SOLO sulle Tabelle lato molti in realtà... visto che il COUNTER si valorizza nel momento in cui lo inserisci...!

    Quindi fai un CICLO sulla Tab(Lato1) leggendo la OLD_PK e la NEW_PK.
    Ora nel ciclo fai una Query UPDATE sulla Tab(latoM) in questo modo:
    "UPDATE T_M SET New_FK=" & NEW_PK & " WHERE old_FK=" & OLD_PK
    Se pertanto scrivi una Funzione che accetta come Parametri:
    
    1) Tabella Lato 1
    2) Nome Old_PK
    3) Nome New_PK
    4) Tabella Lato M
    5) Nome Old_FK
    6) Nome New_FK
    Potrai parametrizzare tutto...
    
    Function SetNewFK(Tbl_Uno As string, Old_Pk as String, New_Pk As String, _
                        Tbl_Molti As string, Old_Fk as String, New_Fk As String)
    Dim rs As DAO.Recordset
    Dim strSQLU As String
    Set rs=DbEngine(0)(0).OpenRecordset("SELECT " & Old_Pk & "," & New_Pk & " FROM " & Tbl_Uno & " ORDER BY " & Old_Pk)
    Do until rs.eof
        strSQLU="UPDATE " & Tbl_Molti & "SET " & New_FK & "=" & Rs.Fields(New_Pk).Value & " WHERE " & old_FK & "=" & rs.Fields(Old_Pk).Value
       DbEngine(0)(0).Execute strSQLU
       DoEvents
       rs.Movenext
    Loop
    rs.close
    set rs=nothing
    A questo punto prima di cancellare le VECCHIE PK-FK, scolleghi le tabelle o meglio aggiorni le relazioni sulle NUOVE CHIAVI e vedi se tutto torna... posi solo alla FINE cancelli le vecchie CHIAVI.

    Fai uno o 2 BackUp... è meglio...

    P.S. il codice l'ho buttato giù a braccio, quindi manca gestione errori e magari ha qualche BUGS... ma era solo per darti uno spunto operativo.
  • Re: Cambio chiave primaria e aggiornamento relazione

    Grazie, stasera provo.
  • Re: Cambio chiave primaria e aggiornamento relazione

    Ciao, @Alex, la tua routine funziona egregiamente, l'ho dovuta solo modificare questa righa:
    strSQLU = "UPDATE " & Tbl_Molti & " SET " & New_Fk & "=" & rs.Fields(New_Pk).Value & " WHERE " & Old_Fk & "='" & rs.Fields(Old_Pk).Value & "'"
    perchè la vecchia chiave era una campo testo..... lo so.... non si fa, ma come detto nel mio primo mex ero giovane ed inesperto

    A questo proposito e' sorto un altro problema.... alcune vecchie chiavi presentavano degli apici, in quanto apostrofi o accenti, che evidentemente inferiscono con la chiamata, che si puo' fare in questi casi, oltre a modificarli a mano come ho fatto io?
  • Re: Cambio chiave primaria e aggiornamento relazione

    Se devi mantenere esattamente gli stessi devi modificare la chiamata:
    
    strSQLU = "UPDATE " & Tbl_Molti & " SET " & New_Fk & "=" & REPLACE(rs.Fields(New_Pk).Value,"'","''") & " WHERE " & Old_Fk & "='" & REPLACE(rs.Fields(Old_Pk).Value,"'","''") & "'"
    Detto questo se come CHIAVI usi campi di quel tipo saresti da licenziare...
Devi accedere o registrarti per scrivere nel forum
4 risposte