首页 > BI/数据库 > Sql Server重命名所有外键约束

Sql Server重命名所有外键约束

BI/数据库

公司服务器上的数据库原先是采用PowerDesigner设计的,那些外键约束的命名非常难看,并且也和后来在SSMS中额外添加的外键约束命名规则不一致,因此我想遍历数据库的所有外键约束,找到外键约束的相关对象,然后重新生成一致的命名。

我采用的命名规则是:

FK_ForeignTable_PrimaryTable_On_ForeignColumn

直白的翻译就是,ForeignTable在ForeignColumn列上引用了PrimaryTable的主键。

Sql Server提供了很多动态管理视图(Dynamic management views,DMV)和存储过程,方便我们对数据库进行维护。这里我用到了以下两个sys.foreign_key_columns(包含外键约束完整信息)和sys.objects(数据库对象信息)这两个DMV以及sp_rename执行重命名的系统存储过程。代码如下:

declare fkcur cursor for
select 
OBJECT_NAME(col.constraint_object_id) as FKConstraintName 
,fkTable.name as FKTable
,fkCol.name as FKColumn
,pkTable.name as PKTable
,pkCol.name as PKColumn
from sys.foreign_key_columns col
-- 外键约束是建立在外键表上的,
-- 因此foreign_key_columns表中的parent_object_id和parent_column_id分别表示外键表和外键列
inner join sys.objects fkTable
    on fkTable.object_id = col.parent_object_id
inner join sys.columns fkCol
    on fkCol.column_id = col.parent_column_id
    and fkCol.object_id = fkTable.object_id
-- foreign_key_columns表中的referenced_object_id和referenced_column_id分别指向
-- 外键约束的主键表对象以及主键列
inner join sys.objects pkTable
    on pkTable.object_id = col.referenced_object_id
inner join sys.columns pkCol 
    on pkCol.column_id = col.referenced_column_id
    and pkCol.object_id = pkTable.object_id
order by OBJECT_NAME(col.constraint_object_id)

open fkcur
declare @constraintName nvarchar(128)
declare @fkTable nvarchar(64)
declare @fkColumn nvarchar(64)
declare @pkTable nvarchar(64)
declare @pkColumn nvarchar(64)
declare @newConstraintName nvarchar(128)

fetch next from fkcur
into @constraintName,@fkTable,@fkColumn,@pkTable,@pkColumn
while @@FETCH_STATUS = 0
begin
    set @newConstraintName = 'FK_'+@fkTable+'_'+@pkTable+'_On_'+@fkColumn
    exec sp_rename @constraintName,@newConstraintName,'Object'
    
    fetch next from fkcur
    into @constraintName,@fkTable,@fkColumn,@pkTable,@pkColumn
end
close fkcur
deallocate fkcur

——Kevin Yang

本博客遵循CC协议2.5,即署名-非商业性使用-相同方式共享
写作很辛苦,转载请注明作者以及原文链接~
如果你喜欢我的文章,你可以订阅我的博客:-D点击订阅我的文章

  1. | #1

    博主果然有内涵。

  2. | #2

    最近如何。咋没回访哦

  3. | #3

    有时间互相问候一下挺好的。不要计较太多了。网络本来就是个大家庭啊

    • Kevin Yang
      | #4

      哥们,你还真是执着,我不知道你这个留言是机器人留的还是人留的。不过你那网站叫人去哪问候,连个留言的地儿都没。

  4. | #5

    顶楼主

  5. | #6

    似乎有点道理

  6. | #7

    thanks

  1. 暂时没有trackbacks.