2010-03-29 12 views
5

Bir tablodaki birincil anahtar sütunumun türünü int'den guid'e değiştirmem gerekiyor. Veritabanında zaten kaybetmek istemediğim veriler var ve göz önünde bulundurulması gereken yabancı anahtarlar var. Bunu yapmak için ağrısız bir yol var mı yoksa büyük bir ** betik aracılığıyla elle yapmak zorunda mıyım? :) Herhangi bir öneri için minnettar olurumsql sunucu değişikliği int türünden bağımsız tanıtıcıya PK türü

+2

Bunu neden yapmak istiyorsunuz? Ben şu anda tam tersi girişiminde bulunuyorum ... – cjk

+0

Ben de, tavsiye ederim ** değil ** bunu yapmak için - bunun için herhangi bir özel neden? –

+0

Bunu yapmam gerekiyor çünkü birden fazla abone sunucusuyla birleştirme çoğaltma ayarlıyorum ve satır kimliğimin senkronizasyon nedeniyle değişmesini istemiyorum. Ayrıca, birleştirme çoğaltması tüm tablolarda bir guid sütunu eklerse, tümüyle bir guid PK col'ınız yoksa, bir ad int int toplaması gereksizdir. – anakic

cevap

5

Scriptleri kullanarak zor yoldan yapmanız gerekecek:

0), tek kullanıcı modunda
1) ana tablo için yeni bir GUID sütun eklemek almak ve bunu doldurmak.
2) yeni ekle) mevcut int FKs
4) damla eski int sütun
5 damla)

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

3 bir güncelleme ile her alt tabloya yeni FK sütun ekleyin ve bunları doldurmak 6) Tekli kullanıcı modu

kılavuz sütunundaki FK'ler, SQL Server Management stüdyosunun sütun ve anahtarları eklemek ve bırakmak için komut dosyaları oluşturması gerekir. Sadece SSMS'deki değişiklikleri yapın ve "Change Script Oluştur" araç çubuğu simgesini tıklayın ve kodu bir metin dosyasına kesip yapıştırabilirsiniz.

0
  1. kullanın seçeneği "/ DAMLA SıNıRLAMA ve indeksleri oluşturma" yaratmak için veritabanı üzerinde "komut üret" (melodi sihirbazı ileri butonuna kullanın). Dizinleri ve kısıtlamaları düşürmek için oluşturulan SQL komut dosyasının bölümünü çalıştırın. aşağıdaki gibi
  2. bir yardımcı fonksiyon ve prosedür oluşturun:

      tasarımcı içinde
    1. Açık tablo (SQL Management Studio veya diğer aracı)
    2. :
      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. Şimdi her tablo için manuel çalışmayı geliyor
    4. Sütunun bigint türünü VARCHAR olarak değiştirin (50)
    5. Yürüt "EXEC bigIntToGuid 'myTable', 'myBigIntColumn'
    6. Geri tablo tasarımcı değişim kolon tipine
    7. "Uniqueidentifier" İsteğe
    8. varsayılan değeri ekleyebilirsiniz için: NEWID() ve/veya set sütun olarak birincil anahtar
  3. sql oluşturulan komut 1. adımda oluşturulan açın
  4. kısıtlaması ve dizin oluşturma için senaryonun sadece bir bölümünü seçip bu yaklaşım guid ve veri bütünlüğünü korumak için int dönüştürme garantiler o

yürütün.

+0

SQL snippet'inde bir yazım hatası var: HashToGuid GuidFromHash okumalı veya işlev adı HashToGuid olarak değiştirilmelidir. –