none
Primärschlüssel, Idenitätsspezifikationen ändern RRS feed

  • Frage

  • Guten Tag,

    ich habe beim Primärschlüssel(int) ist Identity auf Nein, hier werden zuerst manuell vorhandene werte eigegeben. Nach bestimmte Zeit wollen wir dass Autowert als Primärschlüssel erscheint. Ist es möglisch die Eigenschaft Idenitätsspezifikationen nachträglich zu ändern?

    Danke und Gruß

    Montag, 12. August 2013 07:13

Antworten

  • Danach funktioniert es mit Autowertvergabe. Kann hier was schief laufen?

    Hast Du Dir mal das Änderungscript angesehen, das SSMS hier generiert? Die sieht (leicht gekürzt) so aus

    /* To prevent any potential data loss issues, you should review this script in detail before running 
    it outside the context of the database designer.*/
    BEGIN TRANSACTION GO CREATE TABLE dbo.Tmp_TestIdentity ( Id int NOT NULL IDENTITY (1, 1), MyValue nchar(10) NOT NULL ) ON [PRIMARY] GO SET IDENTITY_INSERT dbo.Tmp_TestIdentity ON GO IF EXISTS(SELECT * FROM dbo.TestIdentity) EXEC('INSERT INTO dbo.Tmp_TestIdentity (Id, MyValue) SELECT Id, MyValue FROM dbo.TestIdentity WITH (HOLDLOCK TABLOCKX)') GO SET IDENTITY_INSERT dbo.Tmp_TestIdentity OFF GO DROP TABLE dbo.TestIdentity GO EXECUTE sp_rename N'dbo.Tmp_TestIdentity', N'TestIdentity', 'OBJECT' GO ALTER TABLE dbo.TestIdentity ADD CONSTRAINT PK_TestIdentity PRIMARY KEY CLUSTERED ( Id ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO COMMIT

    Es wir also eine neue Tabelle mit neuem Design = Identity Spalte angelegt, die Daten aus der alten in die neue Tabelle kopiert, die alte Tabelle gelöscht und die neue umbenannt. Grund ist wie erwähnt, das man eine Spalte nicht nachträglich auf Identity ändern kann.
    Und ja, dabei könnte schon was schief gehen, wie die Tabelle sehr groß ist, könnte die Disk volllaufen, die die Daten + Indizes zeitweise doppelt vorhanden sind.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert ElenaMol Montag, 12. August 2013 10:36
    Montag, 12. August 2013 10:16

Alle Antworten

  • Hallo,

    eine vorhandene Spalte kannst Du nachträglich nicht auf die Eigenschaft Identity setzen.

    Du könntest nur eine neue Spalte mit Identity anlegen, die vorhandene IDs umkopieren (mit Option IdentityON) und dann die alte Spalte löschen.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Montag, 12. August 2013 09:09
  • Danke für die Antwort.

    Habe auf einer Tabelle getestet. SQL Server Management Studio-Tabelle entwerfen. Bei Spalteneigenschaften habe Ifentitätsspezifikazion auf Ja umgestellt und gespeichert. Beim speichern kommt Warnung bei betroffenen Tabellen, die Tabelle speiche ich auch. Danach funktioniert es mit Autowertvergabe. Kann hier was schief laufen?

    Gruß

    Montag, 12. August 2013 09:39
  • Danach funktioniert es mit Autowertvergabe. Kann hier was schief laufen?

    Hast Du Dir mal das Änderungscript angesehen, das SSMS hier generiert? Die sieht (leicht gekürzt) so aus

    /* To prevent any potential data loss issues, you should review this script in detail before running 
    it outside the context of the database designer.*/
    BEGIN TRANSACTION GO CREATE TABLE dbo.Tmp_TestIdentity ( Id int NOT NULL IDENTITY (1, 1), MyValue nchar(10) NOT NULL ) ON [PRIMARY] GO SET IDENTITY_INSERT dbo.Tmp_TestIdentity ON GO IF EXISTS(SELECT * FROM dbo.TestIdentity) EXEC('INSERT INTO dbo.Tmp_TestIdentity (Id, MyValue) SELECT Id, MyValue FROM dbo.TestIdentity WITH (HOLDLOCK TABLOCKX)') GO SET IDENTITY_INSERT dbo.Tmp_TestIdentity OFF GO DROP TABLE dbo.TestIdentity GO EXECUTE sp_rename N'dbo.Tmp_TestIdentity', N'TestIdentity', 'OBJECT' GO ALTER TABLE dbo.TestIdentity ADD CONSTRAINT PK_TestIdentity PRIMARY KEY CLUSTERED ( Id ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO COMMIT

    Es wir also eine neue Tabelle mit neuem Design = Identity Spalte angelegt, die Daten aus der alten in die neue Tabelle kopiert, die alte Tabelle gelöscht und die neue umbenannt. Grund ist wie erwähnt, das man eine Spalte nicht nachträglich auf Identity ändern kann.
    Und ja, dabei könnte schon was schief gehen, wie die Tabelle sehr groß ist, könnte die Disk volllaufen, die die Daten + Indizes zeitweise doppelt vorhanden sind.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert ElenaMol Montag, 12. August 2013 10:36
    Montag, 12. August 2013 10:16
  • Vielen Dank!

    Und noch eine Frage. Diese Spalte ist ein Fremdschlüssel. Ich muss wahrscheinlich erst die Beziehung löschen und danach neue Spalte mit Identity einfügen.Gibt es hier ein Problen bei Fremdschlüssel?

    • Als Antwort markiert ElenaMol Montag, 12. August 2013 10:36
    • Tag als Antwort aufgehoben ElenaMol Montag, 12. August 2013 10:36
    Montag, 12. August 2013 10:29
  • Ja, eine Fremdschlüsselbeziehung musst Du vorher löschen und hinterher wieder anlegen. Da bei dem Verfahren die Primary Key Werte gleich bleiben, sollte es in der Hinsicht keine Probleme geben.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Montag, 12. August 2013 10:35