Ich bin ein Java-Entwickler, der zufällig in ein Team ohne DBA eingestiegen ist und in dem ich als Entwickler keine DBA-Rechte erhalten kann. Ich wurde beauftragt, ein ganzes Schema zwischen zwei Datenbanken zu verschieben. Ohne DBA musste ich dies tun und Skripte ausführen, da ich die GUI in SQL Server 2008 nicht verwenden konnte, weil ich keine Administratorrechte hatte.
Alles wurde ohne Probleme verschoben. Als ich jedoch eine gespeicherte Prozedur in der neuen schema.table ausführte, stellte ich fest, dass ich das Identitätsfeld in einer Tabelle verloren hatte. Ich habe das Skript, mit dem die Tabelle erstellt wurde, noch einmal überprüft und es war vorhanden. SQL Server hat es jedoch nicht erhalten, als ich das Skript ausgeführt habe. Ein DBA sagte mir später, dass er das gleiche Problem schon einmal gesehen habe.
Für SQL Server 2008 sind dies auf jeden Fall die Schritte, die ich unternommen habe, um dieses Problem zu lösen, und sie haben funktioniert. Daher veröffentliche ich dies hier in der Hoffnung, dass es jemandem helfen wird. Dies habe ich getan, da ich FK-Abhängigkeiten von einer anderen Tabelle hatte, was dies schwieriger machte:
Ich habe diese Abfrage verwendet, um zu überprüfen, ob die Identität tatsächlich fehlt, und um Abhängigkeiten von der Tabelle anzuzeigen.
1.) Statistiken zu einer Tabelle finden:
exec sp_help 'dbo.table_name_old';
2.) Erstellen Sie eine doppelte, identische neue Tabelle, außer fügen Sie ein Identitätsfeld in das PK-Feld ein, in dem es zuvor war.
3.) Deaktivieren Sie die Identität, um Daten zu verschieben.
SET IDENTITY_INSERT dbo.table_name ON
4.) Übertragen Sie die Daten.
INSERT INTO dbo.table_name_new
(
field1, field2, etc...
)
SELECT
field1, field2, etc...
FROM
dbo.table_name_old;
5.) Überprüfen Sie, ob die Daten vorhanden sind.
SELECT * FROM dbo.table_name_new
6.) Aktivieren Sie die Identität erneut.
SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF
7.) Dies ist das beste Skript, das ich gefunden habe, um alle FK-Beziehungen zu erhalten, um zu überprüfen, auf welche Tabelle (n) die ursprüngliche Tabelle als Abhängigkeiten verweist, und ich bin auf viele gestoßen, also ist es ein Bewahrer!
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.) Stellen Sie vor diesem nächsten Schritt sicher, dass Sie alle PK- und FK-Skripte für alle beteiligten Tabellen haben.
9.) Sie können mit der rechten Maustaste auf jeden Schlüssel klicken und dieses Skript mit SQL Server 2008 ausführen
10.) Löschen Sie die FKs mit dieser Syntax aus den Abhängigkeitstabellen:
ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]
11.) Legen Sie die Originaltabelle ab:
DROP TABLE dbo.table_name_old;
13.) Diese nächsten Schritte basieren auf den Skripten, die Sie in Schritt 9 in SQL Server 2008 erstellt haben.
- Fügen Sie die PK der neuen Tabelle hinzu.
- Fügen Sie den FK zur neuen Tabelle hinzu.
- Fügen Sie die FKs wieder zur Abhängigkeitstabelle hinzu.
14.) Überprüfen Sie, ob alles korrekt und vollständig ist. Ich habe die GUI verwendet, um die Tabellen anzusehen.
15.) Benennen Sie die neue Tabelle in den ursprünglichen Tabellennamen um.
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
Endlich hat alles geklappt!