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
Odpowiedz
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.
- 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.
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)
Teraz przychodzi pracy ręcznej dla każdej tabeli:
- Otwórz tabelę w projektanta (SQL Management Studio lub innego narzędzia)
- Zmiana typu kolumny bigint na VARCHAR (50)
- Wykonanie "EXEC bigIntToGuid" myTable "," myBigIntColumn "
- Powrót do tabeli typu zmiana projektant kolumnowej „uniqueidentifier”
- Opcjonalnie można dodać wartość domyślną: newID() i/lub ustaw kolumnę jako klucz podstawowy
- Otwórz skrypt SQL wygenerowany utworzony w kroku 1
- wybrać tylko część scenariusza ograniczeń i tworzenia indeksu i wykonać to
Takie podejście zapewnia konwersję int do guid i zachować integralność danych.
W fragmencie kodu SQL jest literówka: HashToGuid powinien przeczytać GuidFromHash lub nazwa funkcji powinna zostać zmieniona na HashToGuid. –
- 1. T-SQL - zmiana datetime na typ danych?
- 2. SQL Server 2005 UniqueIdentifier i C# Typ danych
- 3. Konwersja z "uniqueidentifier" na "int" nie jest obsługiwana na podłączonym serwerze bazy danych.
- 4. Jak wygenerować i ręcznie wstawić uniqueidentifier na serwerze sql?
- 5. Konwersja z UniqueIdentifier na BigInt iz powrotem?
- 6. Typ geograficzny serwera SQL Server najbliższy punkt na linii
- 7. Zmiana INT do BigInt
- 8. Zapytanie sql do konwertowania nvarchar na int
- 9. Jak rzutować Scope_Identity() na Int?
- 10. Czy można ustawić domyślną wartość kolumny na NewId() serwera SQL?
- 11. Zmiana kolumny w MySQL z int na podwójny?
- 12. zmiana „typ” obiektów Pythona
- 13. Pivot serwera SQL na wielu kolumnach
- 14. Hibernate: Opinie w Composite PK vs Surrogate PK
- 15. SQL Server 2005 Konwertuj VARCHAR na INT, ale domyślnie na nieprawidłowy typ
- 16. Jaki jest równoważny typ serwera SQL dla typu C#?
- 17. Który typ danych serwera sql najlepiej reprezentuje podwójne w C#?
- 18. newid() wewnątrz funkcji serwera sql
- 19. Konwersja BIGINT UNSIGNED na INT
- 20. SQL AVG zwracający int
- 21. Praca z typem danych XML serwera SQL
- 22. Przykład wstawienia serwera SQL
- 23. Uzyskiwanie listy kolumn dla PK
- 24. problem z Joda nowy DateTime (int, int, int, int, int, int)
- 25. Wywoływanie połączonego serwera sql
- 26. Skrypty Uprawnienia serwera SQL
- 27. Wcześniejsza baza danych serwera SQL do klastrowanego indeksu lub nie
- 28. Ograniczenie FILESTREAM serwera SQL
- 29. MS Access SQL, zmiana typu danych
- 30. Funkcje serwera SQL CLR
Dlaczego chcesz to zrobić? Obecnie próbuję czegoś przeciwnego ... – cjk
Ja też wolałbym polecić ** nie ** robienie tego - jakiś szczególny powód tego? –
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