SQL, Come cambiare colonna nella tabella SQL senza rompere altre dipendenze?
-
28-09-2019 - |
Domanda
Sono sicuro che questo potrebbe essere abbastanza domanda comune, ma non sono riuscito a trovare una buona risposta, come per ora.
Ecco la mia domanda:
Ho una tabella denominata Contatti con la colonna varchar Titolo . Ora, nel bel mezzo dello sviluppo voglio sostituire campo Titolo TitleID , che è chiave esterna per ContactTitles tavolo. Al tavolo momento Contatti ha più di 60 dipendenze (altre tabelle, viste funzioni).
Come posso fare che il modo più sicuro e più facile?
Usiamo: MSSQL 2005, i dati sono già stati migrati, vogliono solo schema di cambiamento
.Modifica
Grazie a tutti per la riproduzione rapida.
Come è stato detto Contatti tabella ha più di 60 dipendenti, ma quando seguente query è stata eseguita, solo 5 di loro usano Titolo . Migrazione script è stato eseguito, quindi non ci sono dati modifiche necessarie.
/*gets all objects which use specified column */
SELECT Name
FROM syscomments sc
JOIN sysobjects so ON sc.id = so.id
WHERE TEXT LIKE '%Title%' AND TEXT LIKE '%TitleID%'
Poi sono passato attraverso quei 5 punti di vista e li aggiornato manualmente.
Soluzione
Per Microsoft SQL Server Redgate avere un prodotto (non gratuito) che può aiutare con questo refactoring http://www.red-gate.com/products/sql_refactor/index.htm
In passato sono riuscito a farlo abbastanza facilmente (se primitivo) semplicemente ottenere un elenco di cose da revisione
SELECT * FROM sys.objects
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%Contacts%'
(ed eventualmente tenendo conto delle dipendenze informazioni e filtrare per tipo di oggetto)
Scripting tutti quelli di interesse in Management Studio poi semplicemente andare giù la lista e rivedere tutti e cambiando il creare per modificare. Dovrebbe essere un abbastanza semplice e ripetitivo cambiamento anche per 60 possibili dipendenze. Inoltre, se si fa riferimento a una colonna inesistente si dovrebbe ottenere un messaggio di errore quando si esegue lo script per ALTER.
Se si utilizza *
nelle query o adhoc SQL nelle applicazioni, ovviamente, le cose possono essere un po 'più difficile.
Altri suggerimenti
refactoring metodi. Inizia con la creazione di un nuovo campo denominato TitleID
, quindi copiare tutti i titoli nella tabella ContactTitles
. Poi, uno ad uno, aggiornare ciascuna delle dipendenze utilizzare il campo TitleID. Basta fare in modo hai ancora un sistema di lavoro dopo ogni passo.
Se i dati sta per essere cambiare, dovrete stare attenti e fare in modo che eventuali modifiche alla colonna Title
cambiano anche la tabella ContactTitles
. Dovrete solo per tenerli in sincronia mentre si sta facendo il refactoring.
Modifica C'è anche un libro su di esso! refactoring Database .
Come altri hanno sottolineato che dipende dal vostro RDBMS.
Ci sono due approcci:
- fare un cambiamento al tavolo e risolvere tutte le dipendenze
- fare una vista che è possibile utilizzare invece di un accesso diretto al tavolo (questo può guardia voi contro i cambiamenti futuri nella tabella di base sottostante (s), ma si potrebbe perdere alcune funzionalità di aggiornamento, a seconda delle vostre DBMS)
Usa SP_Depend 'Nome tabella' per controllare le dipendenze della tavola e quindi utilizzare lo sp_rename per rinominare il nome della colonna che è molto utile. sp_rename rinomina automaticamente l'indice associato quando si rinomina una chiave primaria o UNIQUE. Se un indice rinominato è legata ad un vincolo PRIMARY KEY, il vincolo chiave primaria è anche rinominato automaticamente sp_rename.
e quindi avviare l'aggiornamento della Procedura e funzioni ad uno ad uno non c'è altra scelta buona per il cambiamento come questo se hai trovato poi mi dici anche.