Soy un desarrollador de Java que pasó a formar parte de un equipo sin un DBA y en el que, como desarrollador, no puedo obtener los derechos de DBA. Se me asignó la tarea de mover un esquema completo entre dos bases de datos, por lo que sin tener un DBA, tuve que hacerlo y hacerlo ejecutando scripts, no pudiendo usar la GUI en SQL Server 2008 porque no tenía privilegios de administrador.
Sin embargo, todo se movió sin problemas al ejecutar un procedimiento almacenado en el nuevo esquema.table, descubrí que perdí el campo de identidad en una tabla. Verifiqué dos veces el script que creó la tabla y estaba allí, sin embargo, SQL Server no lo obtuvo cuando ejecuté el script. Un DBA me dijo después que había visto este mismo problema antes.
En cualquier caso, para SQL Server 2008, estos son los pasos que tomé para resolver esto y funcionaron, así que estoy publicando esto aquí con la esperanza de que sea de ayuda para alguien. Esto es lo que hice, ya que tenía dependencias de FK en otra tabla que lo hizo más difícil:
Utilicé esta consulta para verificar que faltaba la identidad y para ver las dependencias en la tabla.
1.) Encuentra estadísticas en una tabla:
exec sp_help 'dbo.table_name_old';
2.) Cree una tabla nueva idéntica y duplicada, excepto que agregue un campo de identidad en el campo PK donde había estado antes.
3.) Desactiva la identidad para mover datos.
SET IDENTITY_INSERT dbo.table_name ON
4.) Transfiera los datos.
INSERT INTO dbo.table_name_new
(
field1, field2, etc...
)
SELECT
field1, field2, etc...
FROM
dbo.table_name_old;
5.) Verifique que los datos estén allí.
SELECT * FROM dbo.table_name_new
6.) Vuelva a habilitar la identidad.
SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF
7.) Este es el mejor script que encontré para obtener todas las relaciones FK para verificar a qué tabla (s) hace referencia la tabla original como dependencias y encontré muchas, ¡así que es un guardián!
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.) Asegúrese de tener todos los scripts PK y FK para todas las tablas involucradas, antes del siguiente paso.
9.) Puede hacer clic con el botón derecho en cada tecla y escribir esto usando SQL Server 2008
10.) Descarte los FK de las tablas de dependencias utilizando esta sintaxis:
ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]
11.) Suelta la tabla original:
DROP TABLE dbo.table_name_old;
13.) Estos próximos pasos se basan en los scripts que creó en SQL Server 2008 en el paso 9.
--Agregue el PK a la nueva tabla.
--Agregue el FK a la nueva tabla.
--Agregue los FK de vuelta a la tabla de dependencias.
14.) Verifique que todo sea correcto y completo. Usé la GUI para mirar las tablas.
15.) Cambie el nombre de la nueva tabla al nombre de las tablas originales.
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
¡Finalmente, todo funcionó!