我用我的数据库重命名了一个表
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的模式中的表的默认约束
经过更多的挖掘,我发现它实际上必须是这种形式:
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)