Eu sou um desenvolvedor java que, por acaso, entrou em uma equipe sem um DBA e onde, como desenvolvedor, não posso obter direitos de DBA. Fui encarregado de mover um esquema inteiro entre dois bancos de dados; portanto, sem ter um DBA, tive que fazê-lo executando scripts, não podendo usar a GUI no SQL Server 2008 porque não tinha privilégios de administrador.
Tudo foi movido sem problemas, no entanto, ao executar um procedimento armazenado no novo schema.table, descobri que perdi o campo de identidade em uma tabela. Verifiquei novamente o script que criou a tabela e ele estava lá, no entanto, o SQL Server não o obteve quando executei o script. Mais tarde, fui informado por um DBA que ele já havia visto esse mesmo problema antes.
De qualquer forma, para o SQL Server 2008, estas são as etapas que tomei para resolver isso e funcionaram, por isso estou postando isso aqui na esperança de que seja uma ajuda para alguém. Isto é o que eu fiz, pois tinha dependências do FK em outra tabela que tornava isso mais difícil:
Eu usei essa consulta para verificar se a identidade estava realmente ausente e para visualizar dependências na tabela.
1.) Encontre estatísticas em uma tabela:
exec sp_help 'dbo.table_name_old';
2.) Crie uma nova tabela idêntica e duplicada, exceto adicione um campo de identidade no campo PK onde estava antes.
3.) Desative a identidade para mover dados.
SET IDENTITY_INSERT dbo.table_name ON
4.) Transfira os dados.
INSERT INTO dbo.table_name_new
(
field1, field2, etc...
)
SELECT
field1, field2, etc...
FROM
dbo.table_name_old;
5.) Verifique se os dados estão lá.
SELECT * FROM dbo.table_name_new
6.) Reative a identidade.
SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF
7.) Este é o melhor script que encontrei para obter todos os relacionamentos do FK para verificar quais tabelas a tabela original faz referência como dependências e me deparei com muitas, por isso é um guardião!
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.) Verifique se você possui todos os scripts PK e FK para todas as tabelas envolvidas, antes desta próxima etapa.
9.) Você pode clicar com o botão direito do mouse em cada chave e criar um script usando o SQL Server 2008
10.) Solte o FK (s) da (s) tabela (s) de dependência usando esta sintaxe:
ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]
11.) Solte a tabela original:
DROP TABLE dbo.table_name_old;
13.) Essas próximas etapas dependem dos scripts que você criou no SQL Server 2008 na etapa 9.
--Adicione o PK à nova tabela.
--Adicione o FK à nova tabela.
--Adicione os FKs de volta à tabela de dependência.
14.) Verifique se tudo está correto e completo. Eu usei a GUI para olhar as tabelas.
15.) Renomeie a nova tabela com o nome da tabela original.
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
Finalmente, tudo funcionou!