Jestem programistą Java, który akurat dostał się do zespołu bez DBA, a jako programista nie mogę uzyskać uprawnień DBA. Zadanie polegało na przeniesieniu całego schematu między dwiema bazami danych, więc bez DBA musiałem to zrobić, wykonując skrypty, nie mogąc korzystać z GUI w SQL Server 2008, ponieważ nie miałem uprawnień administratora.
Wszystko zostało przeniesione bez problemu, jednak podczas uruchamiania procedury składowanej na nowym schemacie. Schema.table odkryłem, że straciłem pole tożsamości w tabeli. Dokładnie sprawdziłem skrypt, który utworzył tabelę i tam był, jednak SQL Server nie dostał go, kiedy uruchomiłem skrypt. DBA powiedział mi później, że widział ten sam problem wcześniej.
W każdym razie, dla SQL Server 2008, są to kroki, które podjąłem, aby rozwiązać ten problem i zadziałały, więc zamieszczam to tutaj w nadziei, że będzie to komuś pomocne. To właśnie zrobiłem, ponieważ miałem zależności FK od innego stołu, co utrudniło to:
Użyłem tego zapytania, aby sprawdzić, czy rzeczywiście brakuje tożsamości i zobaczyć zależności od tabeli.
1.) Znajdź statystyki na stole:
exec sp_help 'dbo.table_name_old';
2.) Utwórz duplikat, identyczną nową tabelę, z wyjątkiem tego, że dodaj pole tożsamości w polu PK, w którym było wcześniej.
3.) Wyłącz tożsamość, aby przenieść dane.
SET IDENTITY_INSERT dbo.table_name ON
4.) Prześlij dane.
INSERT INTO dbo.table_name_new
(
field1, field2, etc...
)
SELECT
field1, field2, etc...
FROM
dbo.table_name_old;
5.) Sprawdź, czy dane tam są.
SELECT * FROM dbo.table_name_new
6.) Ponownie włącz tożsamość.
SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF
7.) To najlepszy skrypt, jaki znalazłem, aby uzyskać wszystkie relacje z FK, aby zweryfikować, która tabela (-y) w oryginalnej tabeli odwołuje się do zależności i natknąłem się na wiele, więc jest to opiekun!
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.) Przed następnym krokiem upewnij się, że masz wszystkie skrypty PK i FK dla wszystkich zaangażowanych tabel.
9.) Możesz kliknąć prawym przyciskiem myszy każdy klucz i wykonać skrypt za pomocą SQL Server 2008
10.) Usuń FK z tabel zależności, używając tej składni:
ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]
11.) Upuść oryginalny stół:
DROP TABLE dbo.table_name_old;
13.) Następne kroki opierają się na skryptach utworzonych w SQL Server 2008 w kroku 9.
- Dodaj PK do nowej tabeli.
- Dodaj FK do nowego stołu.
- Dodaj FK z powrotem do tabeli zależności.
14.) Sprawdź, czy wszystko jest poprawne i kompletne. Użyłem GUI do przeglądania tabel.
15.) Zmień nazwę nowej tabeli na pierwotną nazwę tabeli.
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
Wreszcie wszystko działało!