2010-03-29 12 views
5

Potrzebuję zmienić typ kolumny klucza podstawowego na tabeli z int na guid. Baza danych ma już dane, których nie chcę stracić, i są klucze obce do rozważenia. Czy jest to bezbolesny sposób, czy muszę ręcznie zrobić to za pomocą dużego skryptu ** :) Byłbym wdzięczny za wszelkie sugestie:Zmiana serwera sql Typ PK z int na uniqueidentifier

+2

Dlaczego chcesz to zrobić? Obecnie próbuję czegoś przeciwnego ... – cjk

+0

Ja też wolałbym polecić ** nie ** robienie tego - jakiś szczególny powód tego? –

+0

Muszę to zrobić, ponieważ konfiguruję replikację scalania z kilkoma serwerami subskrybentów i nie chcę, aby mój identyfikator wiersza zmienił się z powodu synchronizacji. Ponadto, ponieważ replikacja scalająca automatycznie dodaje kolumnę guid we wszystkich tabelach, jeśli nie masz już guid PK col, dodatkowy identyfikator użytkownika jest zbędny. – anakic

Odpowiedz

5

Musisz to zrobić w trudny sposób, używając skryptów:

0) tryb pojedynczego użytkownika
1) dodaj nową kolumnę GUID do głównej tabeli i zapełnij ją.
2) dodać nową kolumnę FK do każdej tabeli podrzędnej i wypełnić je z aktualizacji z

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

3) upuść istniejące int FKS
4) drop stare int kolumny
5) dodać nowy FK na kolumnie z kolumnami
6) wyjść z trybu pojedynczego użytkownika

powinieneś być w stanie uzyskać studio zarządzania SQL Server do generowania skryptów do dodawania i upuszczania kolumn i kluczy. Po prostu dokonaj zmian w SSMS i kliknij ikonę paska narzędzi "Generuj skrypt zmian", a możesz wyciąć i wkleić kod do pliku tekstowego.

0
  1. Użyj opcji „Generowanie skryptów” na swojej bazie danych w celu stworzenia „drop/Utwórz CONSTRAINT i indeksów” (użyj przycisku do zaawansowanego kreatora strojenia). Uruchom fragment utworzonego skryptu SQL, aby usunąć indeksy i ograniczenia.
  2. Tworzenie jedną funkcję pomocniczą i procedurę następująco:

    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. Teraz przychodzi pracy ręcznej dla każdej tabeli:

    1. Otwórz tabelę w projektanta (SQL Management Studio lub innego narzędzia)
    2. Zmiana typu kolumny bigint na VARCHAR (50)
    3. Wykonanie "EXEC bigIntToGuid" myTable "," myBigIntColumn "
    4. Powrót do tabeli typu zmiana projektant kolumnowej „uniqueidentifier”
    5. Opcjonalnie można dodać wartość domyślną: newID() i/lub ustaw kolumnę jako klucz podstawowy
  4. Otwórz skrypt SQL wygenerowany utworzony w kroku 1
  5. wybrać tylko część scenariusza ograniczeń i tworzenia indeksu i wykonać to

Takie podejście zapewnia konwersję int do guid i zachować integralność danych.

+0

W fragmencie kodu SQL jest literówka: HashToGuid powinien przeczytać GuidFromHash lub nazwa funkcji powinna zostać zmieniona na HashToGuid. –

Powiązane problemy