Nachdem ich festgestellt habe, dass ich die Primärschlüssel besser von nicht geclustert in geclustert ändere. Bei dieser Frage zu Clustered-Indizes für Identitätsspalten besteht der nächste Schritt darin, dies auf praktische Weise zu tun.
Ich war überrascht, dass ich diese Frage auf SO nicht gefunden habe.
Referenzreferenzen zwischen meinen Tabellen zu haben, kann ich nicht einfach tun
if object_id('MyChild') > 0 drop table MyChild
if object_id('Mytable') > 0 drop table Mytable
create table Mytable(
id int Not NULL
)
go
create table MyChild(
id int Not NULL,
masterid int NULL
)
go
alter table Mytable add constraint PK_Mytable primary key (id)
alter table MyChild add constraint FK_MyChild_MyTable foreign key (masterid) references Mytable(id)
go
-- Now I want to change the primary key into a clustered primary key
-- this throws an error
ALTER TABLE Mytable DROP CONSTRAINT PK_Mytable
GO
ALTER TABLE Mytable ADD CONSTRAINT PK_Mytable PRIMARY KEY CLUSTERED (id)
GO
Hier bekomme ich folgenden Fehler
Msg 3725, Level 16, State 0, Line 1
Auf die 'PK_Mytable'-Einschränkung wird von der 'MyChild'-Tabelle, FOREIGN KEY-Einschränkung 'FK_MyChild_MyTable' verwiesen.
Msg 3727, Level 16, State 0, Line 1
Die Einschränkung konnte nicht gelöscht werden. Siehe vorherige Fehler.
OK Ich weiß, dass es funktioniert, wenn ich die Fremdschlüsseleinschränkung vor der Änderung lösche und sie danach wieder einrichte.
alter table MyChild drop constraint FK_MyChild_MyTable
go
ALTER TABLE Mytable DROP CONSTRAINT PK_Mytable
GO
ALTER TABLE Mytable ADD CONSTRAINT PK_Mytable PRIMARY KEY CLUSTERED (id)
GO
alter table MyChild add constraint FK_MyChild_MyTable foreign key (masterid) references Mytable(id)
go
Das klingt so, als müsste ich alle Fremdschlüsselbeziehungen aus der Datenbank skripten, löschen, meine Primärschlüsseländerungen vornehmen und die Fremdschlüssel aus dem generierten Skript wiederherstellen.
Gibt es bessere Möglichkeiten für diese Aufgabe?
Übrigens. Schließlich möchten wir dies in Produktionsdatenbanken tun. (Ausfallzeiten sind zulässig). Alle Datenbanken sind SQL Server 2005 oder SQL Server 2008.
Bearbeiten:
Ein Mitarbeiter schlug vor, alle Indizes vor diesem Vorgang zu löschen und anschließend neu zu erstellen. Klingt für mich vernünftig.
2. Bearbeiten:
Wenn ich mir diese Frage zu dba.stackexchange anschaue , frage ich mich, ob es ausreichen würde, nur Clustered-Indizes zu den Primärschlüsselspalten der Tabellen hinzuzufügen.
Ich bin kein SQL Server-Typ, aber ich weiß, dass Sie in MySQL Fremdschlüsselprüfungen vorübergehend deaktivieren können. Ich habe schnell nachgefragt, ob dies in SQL Server möglich ist, und habe diesen Link gefunden:
/programming/159038/can-foreign-key-constraints-be-temporically-disabled-using-t-sql
Zusammenfassung aus der Antwort:
quelle