none
IDENTITY-Eigenschaft entfernen RRS feed

  • Frage

  • Hallo,

    ein Primärschlüsselfeld einer Tabelle wurde als autoinkrementierend, d.h. mit IDENTITY (1,1) angelegt.

    Nun hat sich letzteres als nicht sehr praktisch erwiesen. Wie werde ich diese Eigenschaft wieder los?

    In der MMC geht das natürlich problemlos, aber wie geht es per Transact-SQL (SQL 2000)?

    Natürlich muss das Feld erhalten bleiben; es kann also nicht einfach gelöscht und wieder angelegt werden.


    Grüße aus Köln am Rhein Klaus Trapp
    Dienstag, 15. März 2011 09:38

Antworten

  • Hallo Klaus,

    das kannst Du nur mittels einer Hilfsspalte lösen. Frank Kalis hat hier dazu ein Skript hinterlegt: http://www.insidesql.org/blogs/frankkalis/2010/11/25/identity-eigenschaft-entfernen

    In Deinem Fall muss noch der Primärschlüssel gedropped und neu angelegt werden.

    Gruß

    Christoph

    Dienstag, 15. März 2011 10:01
  • In der MMC geht das natürlich problemlos, aber wie geht es per Transact-SQL (SQL 2000)?


    Hallo Klaus,

    wenn Du die Änderung im Enterprise Manager vornimmst, kannst Du dort Dir auch das Änderungsscript anzeigen lassen, was der EM an Transact-SQL Befehlen absetzt. Da wirst Du feststellen, das die Tabelle neu unter einem "Tmp_AlterTabellenName" anlegt, die Daten rüber kopiert, die alte löscht und die neue auf den alten Namen umbenennt; so was in der Richtung hier:

    BEGIN TRANSACTION

    CREATE TABLE dbo.Tmp_Tabelle1

         (

         Test int NOT NULL

         )  ON [PRIMARY]

    GO

    IF EXISTS(SELECT * FROM dbo.Tabelle1)

          EXEC('INSERT INTO dbo.Tmp_Tabelle1 (Test)

              SELECT Test FROM dbo.Tabelle1 TABLOCKX')

    GO

    DROP TABLE dbo.Tabelle1

    GO

    EXECUTE sp_rename N'dbo.Tmp_Tabelle1', N'Tabelle1', 'OBJECT'

    GO

    COMMIT

     


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Dienstag, 15. März 2011 12:32
  • Hallo Christoph,

    besten Dank. Hatte schon erwartet, dass es nicht so einfach ist.

    Allerdings frage ich mich, ob dies Auswirkungen auf Felder in anderen Tabellen hat, die diesen Primärschlüssel als Fremdschlüssel referenzieren. Irgendwo ist da auch noch On Update Cascade eingesetzt ist. Ich werde sicherheitshalber die Foreign Key Constraints löschen und später neu setzen, was ganz gut per Script geht. Und als erstes wird die Datenbank gesichert.

     


    Grüße aus Köln am Rhein Klaus Trapp
    Dienstag, 15. März 2011 12:42

Alle Antworten

  • Hallo Klaus,

    das kannst Du nur mittels einer Hilfsspalte lösen. Frank Kalis hat hier dazu ein Skript hinterlegt: http://www.insidesql.org/blogs/frankkalis/2010/11/25/identity-eigenschaft-entfernen

    In Deinem Fall muss noch der Primärschlüssel gedropped und neu angelegt werden.

    Gruß

    Christoph

    Dienstag, 15. März 2011 10:01
  • In der MMC geht das natürlich problemlos, aber wie geht es per Transact-SQL (SQL 2000)?


    Hallo Klaus,

    wenn Du die Änderung im Enterprise Manager vornimmst, kannst Du dort Dir auch das Änderungsscript anzeigen lassen, was der EM an Transact-SQL Befehlen absetzt. Da wirst Du feststellen, das die Tabelle neu unter einem "Tmp_AlterTabellenName" anlegt, die Daten rüber kopiert, die alte löscht und die neue auf den alten Namen umbenennt; so was in der Richtung hier:

    BEGIN TRANSACTION

    CREATE TABLE dbo.Tmp_Tabelle1

         (

         Test int NOT NULL

         )  ON [PRIMARY]

    GO

    IF EXISTS(SELECT * FROM dbo.Tabelle1)

          EXEC('INSERT INTO dbo.Tmp_Tabelle1 (Test)

              SELECT Test FROM dbo.Tabelle1 TABLOCKX')

    GO

    DROP TABLE dbo.Tabelle1

    GO

    EXECUTE sp_rename N'dbo.Tmp_Tabelle1', N'Tabelle1', 'OBJECT'

    GO

    COMMIT

     


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Dienstag, 15. März 2011 12:32
  • Hallo Christoph,

    besten Dank. Hatte schon erwartet, dass es nicht so einfach ist.

    Allerdings frage ich mich, ob dies Auswirkungen auf Felder in anderen Tabellen hat, die diesen Primärschlüssel als Fremdschlüssel referenzieren. Irgendwo ist da auch noch On Update Cascade eingesetzt ist. Ich werde sicherheitshalber die Foreign Key Constraints löschen und später neu setzen, was ganz gut per Script geht. Und als erstes wird die Datenbank gesichert.

     


    Grüße aus Köln am Rhein Klaus Trapp
    Dienstag, 15. März 2011 12:42