2016-09-22 1 views
0

Я хотел бы удалить первичный ключ, а затем добавить первичный ключ в тот же столбец в 1 хранимой процедуре.Ограничения на удаление и добавление в одной хранимой процедуре

У меня есть ограничения на падение в пределах Begin Transaction' and Commit Transaction then try to add the constraints within another set of Начало транзакции and Commit Transaction`.

Я получаю сообщение об ошибке, что первичный ключ уже существует для этого столбца, когда он был сброшен в первом наборе транзакций.

Это код:

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 

Если первый набор ограничений отбрасываются и совершенные, я не должен быть в состоянии добавить первичный ключ столбца, который ранее имел первичный ключ?

ОБНОВЛЕНИЕ Я думаю, что знаю проблему. Это связано с тем, что есть внешний ключ, связанный с первичным ключом, который я пытаюсь удалить.

Мне нужно будет удалить все внешние ключи, связанные со всеми основными ключами, которые я пытаюсь сбросить. Затем добавьте первичные ключи назад. Затем добавьте внешние ключи.

+0

попытаться 'DISABLE' и' ENABLE' вместо '' DROP' и ADD' – techspider

+0

я должен упасть ограничение, потому что его необходимо переименовать или удалить навсегда. –

+0

Это не сработает. Для этого в одной процедуре потребуется переместить код в динамический sql. Это связано с тем, что компилятор вызовет исключение, поскольку в таблице уже есть первичный ключ. Он не выполняет вашу логику, чтобы определить, что первичный ключ уже отброшен. Я бы поставил под вопрос, почему вам нужна хранимая процедура для этого. Вы действительно бросаете и воссоздаете первичные ключи так часто, что вам нужна процедура? –

ответ

0

Уверены ли вы, что проблема не с тем же именем индекса, существующим в базе данных, в тот момент, когда ваш код пытается его создать? Имя индекса должно быть уникальным во всей области базы данных не только в одной области таблицы. Вы можете диагностировать его, поставив под запрос до, между и после ваших операций по сделке:

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

Нет. Проблема заключается в том, что в начале хранимой процедуры я отбрасываю первичный ключ с именем ** PK_Coatings ** для таблицы ** Покрытие **, затем Commit Transaction. Затем попробуйте добавить ограничение первичного ключа ** PK_dbo.Coating ** для таблицы ** Покрытие **, и он терпит неудачу, потому что он сообщает, что есть первичный ключ для таблицы ** Покрытие **. Но я бросил его и совершил. Так почему же он все еще там? –

 Смежные вопросы

  • Нет связанных вопросов^_^