Sono uno sviluppatore Java che è capitato di entrare in una squadra senza un DBA e uno in cui come sviluppatore, non posso ottenere i diritti DBA. Mi è stato assegnato il compito di spostare un intero schema tra due database, quindi senza avere un DBA, ho dovuto farlo e farlo eseguendo degli script, non potendo usare la GUI in SQL Server 2008 perché non avevo i privilegi di amministratore.
Tutto è stato spostato senza problemi, tuttavia, durante l'esecuzione di una procedura memorizzata sul nuovo schema.table, ho scoperto di aver perso il campo identità in una tabella. Ho ricontrollato lo script che ha creato la tabella ed era lì, tuttavia, SQL Server non l'ha capito quando ho eseguito lo script. In seguito mi è stato detto da un DBA che aveva già visto lo stesso problema in precedenza.
In ogni caso, per SQL Server 2008, questi sono i passi che ho fatto per risolverlo e hanno funzionato, quindi sto pubblicando questo qui nella speranza che possa essere di aiuto a qualcuno. Questo è quello che ho fatto perché avevo dipendenze FK su un altro tavolo che rendeva questo più difficile:
Ho usato questa query per verificare che mancasse davvero l'identità e per visualizzare le dipendenze sul tavolo.
1.) Trova le statistiche su una tabella:
exec sp_help 'dbo.table_name_old';
2.) Creare una nuova tabella duplicata e identica, tranne aggiungere un campo identità nel campo PK in cui era stato prima.
3.) Disabilitare l'identità per spostare i dati.
SET IDENTITY_INSERT dbo.table_name ON
4.) Trasferire i dati.
INSERT INTO dbo.table_name_new
(
field1, field2, etc...
)
SELECT
field1, field2, etc...
FROM
dbo.table_name_old;
5.) Verificare che i dati siano presenti.
SELECT * FROM dbo.table_name_new
6.) Riattivare l'identità.
SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF
7.) Questo è lo script migliore che ho trovato per ottenere tutte le relazioni FK per verificare quali tabelle fanno riferimento alla tabella originale come dipendenze e ne ho incontrate molte, quindi è un custode!
SELECT f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
ORDER BY ReferenceTableName;
8.) Assicurati di avere tutti gli script PK e FK per tutte le tabelle coinvolte, prima di questo passaggio successivo.
9.) È possibile fare clic con il pulsante destro del mouse su ciascuna chiave e copiarla utilizzando SQL Server 2008
10.) Eliminare gli FK dalle tabelle delle dipendenze usando questa sintassi:
ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]
11.) Rilascia la tabella originale:
DROP TABLE dbo.table_name_old;
13.) Questi passaggi successivi si basano sugli script creati in SQL Server 2008 al passaggio 9.
- Aggiungi il PK alla nuova tabella.
- Aggiungi l'FK alla nuova tabella.
--Aggiunta dell'FK alla tabella delle dipendenze.
14.) Verifica che tutto sia corretto e completo. Ho usato la GUI per guardare le tabelle.
15.) Rinomina la nuova tabella con il nome originale delle tabelle.
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
Finalmente tutto ha funzionato!