在一个存储过程中删除和添加约束

时间:2016-09-22 18:15:38

标签: sql-server stored-procedures transactions

我想删除一个主键,然后在一个存储过程中将主键添加到同一列。

我在Begin Transaction' and提交事务then try to add the constraints within another set of开始事务and提交事务`中有丢弃约束。

我收到的错误是,当该列在第一组事务中被删除时,该列已存在主键。

这是代码:

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

如果第一组约束被删除并提交,我是否应该能够在以前拥有主键的列上添加主键?

更新 我想我知道这个问题。这是因为有一个外键与我想要删除的主键相关联。

我将需要删除与我尝试删除的所有主键相关联的所有外键。然后添加主键。然后添加外键。

1 个答案:

答案 0 :(得分: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*/