如何重命名约束

Mat*_*sto 16 sql-server

我用我的数据库重命名了一个表

EXEC sp_rename 'tblOldAndBusted', 'tblNewAndShiny'
Run Code Online (Sandbox Code Playgroud)

并且所有外键约束都更新为新表名,但它们仍然基于旧表名命名.例如,我现在有FK_tblOldAndBusted_tblTastyData,但我想要FK_tblNewAndShiny_tblTastyData.

有一个简单的方法来编写脚本吗?

另外,我是不是太肛门了?我知道数据库在约束中使用旧表名称可以正常工作,但感觉就像破窗户一样.

Den*_*eev 22

尝试:

exec sp_rename 'FK_tblOldAndBusted_tblTastyData', 'FK_tblNewAndShiny_tblTastyData', 'object'
Run Code Online (Sandbox Code Playgroud)

此外,当您处理非默认值时,存在关于重命名此类事物的错误schema.

无法通过rsocol @Microsoft Connect重命名不是dbo的模式中的表的默认约束

  • 对于那些使用`sp_rename`的对象在名称中有一个点(ala EntityFramework创建的约束),你需要括起来`@objname`参数,以及包括''OBJECT'`作为`@ objtype`参数:`exec sp_rename @objname ='[dbo].[FK_dbo.TableA_dbo.TableB_ColumnOne]',@ newname ='FK_dbo.TableA_dbo.TableC_ColumnOne',@ objtype ='object';` (2认同)

ozz*_*ozz 5

经过更多的挖掘,我发现它实际上必须是这种形式:

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint', N'OBJECT'
Run Code Online (Sandbox Code Playgroud)

来源


小智 5

我不是游标的忠实粉丝,这可以写得更简单。

DECLARE @SQLCmd varchar(MAX) = ''
SELECT 
    @SQLCmd += 'EXEC sp_rename ''' + dc.name + ''', ''DF' + 
                OBJECT_NAME( dc.parent_object_id ) + c.name + ''', ''OBJECT'';'
FROM 
    sys.default_constraints dc
    JOIN sys.columns c 
        ON c.object_id = dc.parent_object_id 
        AND c.column_id = dc.parent_column_id
WHERE 
    dc.name != 'DF' + object_name( dc.parent_object_id ) + c.name 
    AND OBJECT_NAME( dc.parent_object_id ) != 'dtproperties'
EXEC( @SqlCmd ) 
Run Code Online (Sandbox Code Playgroud)