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.
versuchen, 'DISABLE' und' ENABLE' statt 'DROP' und' ADD' – techspider
Ich habe fallen die Einschränkung, da sie dauerhaft umbenannt oder gelöscht werden muss. –
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? –