Domanda

Ora che abbiamo esaurito la capacità di int su una colonna PK (che è un IDENTITY ) vorrei fare questo per bigint , ma il semplice ALTER TABLE sembra non essere in grado di gestire una tabella così grande. Quindi la mia domanda è: come posso cambiare il tipo di una colonna PK mantenendo i valori attuali sul posto e devo modificare anche le tabelle di riferimento?

È stato utile?

Soluzione

Oltre al suggerimento di KLE, potrebbero essere utili le seguenti query:

Per disabilitare tutti i vincoli sulle tabelle che fanno riferimento a oldTable, provare a eseguire l'output della seguente query:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' NOCHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

Per spostare tutti i dati nella nuova tabella, con alterazione del campo provare questo:

INSERT INTO newTable
SELECT CONVERT(BIGINT, ID) AS ID, COL1, COL2, ..., COLN
FROM oldTable

Per eliminare la vecchia tabella:

DROP TABLE oldTable

Per rinominare la nuova tabella con il vecchio nome:

sp_rename newTable, oldTable

Per riattivare tutti i vincoli sulle tabelle che fanno riferimento a oldTable, provare a eseguire l'output della seguente query:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' CHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

Spero che aiuti ...

Altri suggerimenti

Quello che vorremmo fare è:

  

salva il tuo tavolo

  1. crea una nuova tabella con la struttura corretta
  2. disabilita tutti i vincoli su queste tabelle e quelli che li fanno riferimento
  3. sposta tutti i dati nella nuova tabella, con alterazione del campo; può essere fatto per lotti
  4. elimina la vecchia tabella quando è vuota
  5. rinomina la nuova tabella con il vecchio nome
  6. abilita tutti i vincoli su tutte le tabelle (alcune colonne FK e i vincoli probabilmente devono essere corretti anche ... Ma non sono PK, quindi sono modificabili)

      

    6 modificati (grazie ad Alexey)

Questo è pulito, fattibile in lotti, ben compreso.

Dovrai anche modificare le tabelle figlio. Dopo tutto, ora proverai a inserire anche un grande int. Vorrei cambiare prima le tabelle figlio

Questo non è un processo facile o breve. Ti suggerirei di dire ai tuoi utenti che il database sarà inattivo per manutenzione (puoi valutare quanto tempo impiega a fare dev) in una data prestabilita e ripristinare il database alla modalità singolo utente mentre esegui questi cambiamenti. Non si desidera perdere i dati aggiunti (o modificati) dagli utenti a una tabella mentre si passa all'altra. se per qualche motivo non puoi avere una finestra di manutenzione (e ti consiglio vivamente per l'integrità dei dati che fai), allora devi prima cambiare le tabelle figlio per evitare errori di inserimento se sei davvero vicino al limite e sarà vedere i numeri grandi quasi immediatamente.

Assicurati di eseguire lo script dell'intera struttura della base di dati, inclusi valori predefiniti, trigger, controllo degli indici dei costrutti, ecc. poiché vorrai ricreare tutto.

Assicurati di fare tutto questo tramite script su dev. Ciò renderà molto più semplice eseguire un prod dopo aver testato il processo.

Penso che puoi solo creare un nuovo database con il tipo di dati PK modificato, quindi esportare / importare i dati o inserire in blocco in un nuovo, quindi rinominare il nuovo database. Ovviamente questo è vero se hai molte tabelle di riferimento e il tuo nuovo tipo di dati PK non è compatibile con i precedenti.

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