2016-09-22 8 views
0

Ich möchte einen Primärschlüssel löschen und dann einen Primärschlüssel zu derselben Spalte in einer gespeicherten Prozedur hinzufügen.Löschen und Hinzufügen von Einschränkungen in einer gespeicherten Prozedur

Ich habe die Drop-Einschränkungen innerhalb Begin Transaction' and Commit-Transaktion then try to add the constraints within another set of Beginne Transaktion and Commit-Transaktion ".

Ich erhalte den Fehler, dass ein Primärschlüssel für diese Spalte bereits existiert, wenn sie in der ersten Gruppe von Transaktionen gelöscht wurde.

Dies ist der Code:

BEGIN TRANSACTION 

ALTER TABLE [dbo].[Lens] DROP CONSTRAINT [FK_Lens_Style]; 
ALTER TABLE [dbo].[Lens] DROP CONSTRAINT [FK_Lens_Type]; 
ALTER TABLE [dbo].[Coating] DROP CONSTRAINT [PK_Coatings]; 
ALTER TABLE [dbo].[CoatingCost] DROP CONSTRAINT [PK_CoatingCost]; 

COMMIT TRANSACTION 

BEGIN TRANSACTION 

    ALTER TABLE [dbo].[Coating] 
     ADD CONSTRAINT [PK_dbo.Coating] 
     PRIMARY KEY CLUSTERED ([CoatingId] ASC) 
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
         IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
         ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

COMMIT TRANSACTION 

Wenn der erste Satz von Einschränkungen fallen gelassen werden und verpflichtet, sollte nicht ich in der Lage sein, einen Primärschlüssel für die Spalte hinzuzufügen, die zuvor einen Primärschlüssel hatte?

UPDATE Ich glaube, ich kenne das Problem. Dies liegt daran, dass ein Fremdschlüssel mit dem Primärschlüssel verknüpft ist, den ich löschen möchte.

Ich muss alle Fremdschlüssel, die mit allen Primärschlüsseln verbunden sind, die ich ablegen möchte, löschen. Fügen Sie dann die Primärschlüssel zurück. Fügen Sie dann die Fremdschlüssel zurück.

+0

versuchen, 'DISABLE' und' ENABLE' statt 'DROP' und' ADD' – techspider

+0

Ich habe fallen die Einschränkung, da sie dauerhaft umbenannt oder gelöscht werden muss. –

+0

Das wird nicht ganz so funktionieren. Um dies in einer einzigen Prozedur durchzuführen, müssen Sie den Code in dynamic sql verschieben. Dies liegt daran, dass der Compiler eine Ausnahme auslöst, weil die Tabelle bereits einen Primärschlüssel hat. Es wird nicht durch Ihre Logik ausgeführt, um festzustellen, dass der Primärschlüssel bereits gelöscht wurde. Ich würde fragen, warum Sie hierfür eine gespeicherte Prozedur benötigen. Werden wirklich Primärschlüssel gelöscht und neu erstellt, so dass Sie eine Prozedur dafür benötigen? –

Antwort

0

Sind Sie sicher, dass das Problem nicht mit dem gleichen Indexnamen in der Datenbank vorhanden ist, wenn der Code versucht, einen zu erstellen? Der Name eines Index muss im gesamten Datenbankbereich nicht nur in einem einzelnen Tabellenbereich eindeutig sein. Vielleicht möchten Sie es diagnostizieren, indem eine unter Abfrage setzen vor, zwischen und nach der Transaktion Operationen:

SELECT 
    so.name AS tableName 
    , si.name AS indexName 
    , si.type_desc AS indexType 
    , si.is_primary_key AS isPK 
    FROM 
    sys.indexes AS si 
    JOIN sys.objects AS so ON si.object_id = so.object_id 
    WHERE 
    si.name IS NOT NULL /*otherwise it will select all tables without explicit index*/ 
    AND 
    so.type = 'U'/*otherwise it unnecessarily will select indexes of system tables*/ 
+0

Nein. Das Problem scheint zu sein, dass ich zu Beginn der gespeicherten Prozedur den Primärschlüssel mit der Bezeichnung ** PK_Coatings ** für die Tabelle ** Coating ** ablege und dann die Transaktion festschreibe. Dann versuchen Sie, die Primärschlüsseleinschränkung ** PK_dbo.Coating ** für die Tabelle ** Coating ** hinzuzufügen, und es schlägt fehl, weil es meldet, dass es einen Primärschlüssel für die Tabelle ** Coating ** gibt. Aber ich habe es fallen gelassen und es begangen. Warum ist es immer noch da? –

Verwandte Themen