Ich bin ein Java-Entwickler, der zufällig in ein Team ohne DBA gekommen ist und in dem ich als Entwickler keine DBA-Rechte bekommen kann. Ich hatte die Aufgabe, ein komplettes Schema zwischen zwei Datenbanken zu verschieben. Da ich keinen DBA hatte, musste ich das mit Hilfe von Skripten machen und konnte die grafische Benutzeroberfläche von SQL Server 2008 nicht verwenden, weil ich keine Admin-Rechte hatte.
Alles wurde ohne Probleme verschoben, aber beim Ausführen einer gespeicherten Prozedur in der neuen schema.table stellte ich fest, dass ich das Identitätsfeld in einer Tabelle verloren hatte. Ich überprüfte das Skript, mit dem die Tabelle erstellt wurde, und es war vorhanden, aber SQL Server konnte es nicht abrufen, als ich das Skript ausführte. Später erfuhr ich von einem DBA, dass er dasselbe Problem schon einmal erlebt hatte.
Auf jeden Fall sind dies die Schritte, die ich für SQL Server 2008 unternommen habe, um das Problem zu beheben, und sie haben funktioniert, also poste ich das hier in der Hoffnung, dass es jemandem hilft. Ich bin folgendermaßen vorgegangen, da ich FK-Abhängigkeiten zu einer anderen Tabelle hatte, die das Problem erschwerten:
Ich habe diese Abfrage verwendet, um zu überprüfen, ob die Identität tatsächlich fehlt, und um die Abhängigkeiten der Tabelle anzuzeigen.
1.) Finden Sie Statistiken in einer Tabelle:
exec sp_help 'dbo.table_name_old';
2.) Erstellen Sie eine doppelte, identische neue Tabelle, fügen Sie jedoch ein Identitätsfeld an der Stelle des PK-Feldes ein, an der es sich zuvor befunden hat.
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 und zu überprüfen, welche Tabelle(n) die Originaltabelle als Abhängigkeiten referenziert und ich bin auf viele gestoßen, daher ist es ein Muss!
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.) Vergewissern Sie sich, dass Sie alle PK- und FK-Skripte für alle beteiligten Tabellen haben, bevor Sie diesen nächsten Schritt ausführen.
9.) Sie können mit der rechten Maustaste auf jeden Schlüssel klicken und dieses Skript mit SQL Server 2008
10.) Entfernen Sie den/die FK aus der/den Abhängigkeitstabelle(n) unter Verwendung dieser Syntax:
ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]
11.) Lassen Sie die ursprüngliche Tabelle fallen:
DROP TABLE dbo.table_name_old;
13.) Diese nächsten Schritte beruhen auf den Skripts, die Sie in Schritt 9 in SQL Server 2008 erstellt haben.
-Hinzufügen der PK zur neuen Tabelle.
-Hinzufügen der FK in die neue Tabelle.
-Addieren Sie die FK's wieder in die Abhängigkeitstabelle.
14.) Überprüfen Sie, ob alles korrekt und vollständig ist. Ich habe die GUI benutzt, um mir die Tabellen anzusehen.
15.) Benennen Sie die neue Tabelle in den Namen der Originaltabelle um.
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
Endlich hat alles funktioniert!