SQLServer 重命名所有外键约束

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Sql Server重命名所有外键约束

公司服务器上的数据库原先是采用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

, as FKTable

, as FKColumn

, as PKTable

, 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

相关文档
最新文档