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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top