Soy un desarrollador de Java que pasó a formar parte de un equipo sin un DBA y otro en el que, como desarrollador, no puedo obtener derechos de DBA. Me encargaron mover un esquema completo entre dos bases de datos, así 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.
Todo se movió sin problemas, sin embargo, al ejecutar un procedimiento almacenado en el nuevo schema.table, encontré que perdí el campo de identidad en una tabla. Revisé 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 más tarde 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 funcionó, así que estoy publicando aquí con la esperanza de que sea de ayuda para alguien. Esto es lo que hice, ya que tenía dependencias FK en otra tabla que hacía esto más difícil:
Utilicé esta consulta para verificar que la identidad realmente faltaba y para ver las dependencias en la tabla.
1.) encontrar estadísticas sobre una mesa:
exec sp_help 'dbo.table_name_old';
2.) Crear un duplicado, idéntica nueva tabla, excepto añadir un campo de identidad en el campo PK donde había estado antes.
3.) Deshabilita 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 guión que he encontrado para conseguir todas las relaciones FK para verificar qué tabla (s) de las referencias de tabla originales como dependencias y me encontré con muchos, por lo que es muy bueno!
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 que tiene toda la PK y FK guiones para todas las tablas implicadas, antes de este siguiente paso.
9.) Puede hacer clic derecho sobre cada tecla y la escritura esto utilizando SQL Server 2008
10.) La caída de la FK (s) de la tabla (s dependencia), con esta sintaxis:
ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]
11.) la caída de la tabla original:
DROP TABLE dbo.table_name_old;
13.) los pasos siguientes se basan en los guiones que ha creado en SQL Server 2008 en el paso 9.
--Agregue el PK a la nueva tabla.
--Añada el FK a la nueva tabla.
--Vuelva a colocar el FK en la tabla de dependencias.
14.) Verifique que todo esté correcto y completo. Usé la GUI para mirar las tablas.
15.) Cambie el nombre de la nueva tabla al nombre original de las tablas.
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
¡Finalmente, todo funcionó!
Si los datos de la tabla son pequeños, esta opción funciona bien. Si la tabla es grande, prefiero otra opción: use ALTER TABLE ... SWITCH para reemplazar el esquema de la tabla con otra versión con una columna IDENTITY pero con un esquema idéntico. La ventaja del enfoque ALTER TABLE ... SWITCH es que se completa rápidamente (menos de 5 segundos para una tabla de mil millones de filas), ya que no es necesario copiar ni modificar datos de la tabla. Sin embargo, hay advertencias y limitaciones. Ver mi respuesta a continuación para más detalles. –
@Justin Grat: ¡Una alternativa muy interesante y que no había considerado! La razón por la que esto funciona es porque IDENTIDAD es una propiedad de columna y no un tipo de datos, por lo que el método SWITCH valida los esquemas entre las dos tablas (antiguas y nuevas) como identificables independientemente de la diferencia de IDENTIDAD. ¡Gracias por compartir! –
Si no tiene demasiados datos, puede crear "crear la tabla" generando un script desde SSMS. Haga clic con el botón derecho en la tabla> Scrip Table as> Create TABLE to> (new query editor?). Luego suéltelo, y dentro de ese script puede agregar la parte 'IDENTITY (1, 1)' con la columna de la clave principal – goamn