2010-03-29 11 views
5

Necesito cambiar el tipo de columna de mi clave principal en una tabla de int a guid. La base de datos ya tiene datos que no quiero perder, y hay claves externas a considerar. ¿Hay alguna manera fácil de hacerlo o tengo que hacerlo manualmente a través de un gran ** script? :) Agradecería cualquier sugerenciasql server change PK type from int to uniqueidentifier

+2

¿Por qué quieres hacer esto? Actualmente estoy intentando lo opuesto ... – cjk

+0

Yo, también, preferiría recomendar ** no ** hacer eso, ¿alguna razón en particular para esto? –

+0

Necesito hacerlo porque estoy configurando la duplicación de mezcla con varios servidores de suscriptores, y no quiero que mi identificador de fila cambie debido a la sincronización. Además, dado que la duplicación de mezcla agrega automáticamente una columna guid en todas las tablas, si aún no cuenta con una columna PK de guía, una columna ID adicional es redundante. – anakic

Respuesta

5

Tendrá que hacerlo de la manera difícil, utilizando scripts:

0) entrar en el modo de usuario único
1) agregar la nueva columna GUID a la tabla principal y rellenarla.
2) añadir la nueva columna FK a cada tabla secundaria y rellenarlas con una actualización del

UPDATE c 
    SET FKcolumn=p.NewGuid 
    FROM ChildTable    c 
     INNER JOIN ParentTable p ON p.OldIntID=c.OldIntId 

3) retirar los int FKs
4) Caída de las antiguas columnas int existentes
5) añadir el nuevo FKs en la columna guid
6) salir del modo de usuario único

debe poder conseguir que SQL Server Management studio genere los guiones para agregar y soltar las columnas y claves. Simplemente realice los cambios en SSMS y haga clic en el icono de la barra de herramientas "Generar secuencia de cambio" y podrá cortar y pegar el código en un archivo de texto.

0
  1. Use la opción "Generar scripts" en su base de datos para crear "DROP/CREATE CONSTRAINT and INDEXES" (use el botón avanzado para sintonizar el asistente). Ejecutar parte del script SQL creado para eliminar índices y restricciones.
  2. Crear una función auxiliar y el procedimiento de la siguiente manera:

    CREATE FUNCTION [dbo].[GuidFromHash] 
    (
        @Input nvarchar(MAX) 
    ) 
    RETURNS nvarchar(MAX) 
    AS 
    BEGIN 
        RETURN LOWER(SUBSTRING(@Input, 1,8)+'-'+SUBSTRING(@Input, 9,4)+'-'+SUBSTRING(@Input, 13,4)+'-'+SUBSTRING(@Input, 17,4)+'-'+SUBSTRING(@Input, 21,12)) 
    END 
    
    CREATE PROCEDURE [dbo].[bigIntToGuid] 
    (
        @table varchar(50), 
        @column varchar(50) 
    ) 
    AS 
    DECLARE @SQL VARCHAR(MAX) 
    
    SET @SQL='UPDATE @Table SET @Column=dbo.HashToGuid(''cc''+CONVERT(VARCHAR, HASHBYTES(''MD5'',LTRIM(@Column)),2))' 
    SET @SQL=REPLACE(@SQL,'@Table',@Table) 
    SET @SQL=REPLACE(@SQL,'@Column',@Column) 
    EXEC(@SQL) 
    
    SET @SQL='SELECT * FROM @Table' 
    SET @SQL=REPLACE(@SQL,'@Table',@Table) 
    SET @SQL=REPLACE(@SQL,'@Column',@Column) 
    EXEC(@SQL) 
    
  3. Ahora viene el trabajo manual para cada mesa:

    1. tabla abierta en el diseñador (SQL Management Studio u otra herramienta)
    2. Cambiar el tipo de columna bigint a VARCHAR (50)
    3. Ejecutar "EXEC bigIntToGuid 'myTable', 'myBigIntColumn'
    4. Volver a la tabla de tipos de columna de cambio de diseñador para "uniqueidentifier"
    5. Opcionalmente se puede añadir un valor por defecto: newid(), y/o un conjunto de columna como clave principal
  4. Abra la secuencia de comandos SQL generado creado en el paso 1
  5. Seleccione única porción de la secuencia de comandos para la restricción y la creación de índices, y ejecutarlo

Este enfoque asegura la conversión de int a gUID y mantener la integridad de datos.

+0

Hay un error tipográfico en el fragmento SQL: HashToGuid debe leer GuidFromHash, o el nombre de la función debe cambiarse a HashToGuid. –