重命名Sql Server外键约束名的方法
创始人
2024-07-17 16:11:42
0

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

采用的命名规则是:

  1. FK_ForeignTable_PrimaryTable_On_ForeignColumn 

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

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

  1. declare fkcur cursor for  
  2. select  
  3. OBJECT_NAME(col.constraint_object_id) as FKConstraintName  
  4. ,fkTable.name as FKTable  
  5. ,fkCol.name as FKColumn  
  6. ,pkTable.name as PKTable  
  7. ,pkCol.name as PKColumn  
  8. from sys.foreign_key_columns col  
  9. -- 外键约束是建立在外键表上的,  
  10. -- 因此foreign_key_columns表中的parent_object_id和parent_column_id分别表示外键表和外键列  
  11. inner join sys.objects fkTable  
  12.     on fkTable.object_id = col.parent_object_id  
  13. inner join sys.columns fkCol  
  14.     on fkCol.column_id = col.parent_column_id  
  15.     and fkCol.object_id = fkTable.object_id  
  16. -- foreign_key_columns表中的referenced_object_id和referenced_column_id分别指向  
  17. -- 外键约束的主键表对象以及主键列  
  18. inner join sys.objects pkTable  
  19.     on pkTable.object_id = col.referenced_object_id  
  20. inner join sys.columns pkCol  
  21.     on pkCol.column_id = col.referenced_column_id  
  22.     and pkCol.object_id = pkTable.object_id  
  23. order by OBJECT_NAME(col.constraint_object_id)  
  24.  
  25. open fkcur  
  26. declare @constraintName nvarchar(128)  
  27. declare @fkTable nvarchar(64)  
  28. declare @fkColumn nvarchar(64)  
  29. declare @pkTable nvarchar(64)  
  30. declare @pkColumn nvarchar(64)  
  31. declare @newConstraintName nvarchar(128)  
  32.  
  33. fetch next from fkcur  
  34. into @constraintName,@fkTable,@fkColumn,@pkTable,@pkColumn  
  35. while @@FETCH_STATUS = 0 
  36. begin  
  37.     set @newConstraintName = 'FK_'+@fkTable+'_'+@pkTable+'_On_'+@fkColumn  
  38.     exec sp_rename @constraintName,@newConstraintName,'Object'  
  39.  
  40.     fetch next from fkcur  
  41.     into @constraintName,@fkTable,@fkColumn,@pkTable,@pkColumn  
  42. end  
  43. close fkcur  
  44. deallocate fkcur  

 

 

 

 

【编辑推荐】

SQL Server外关键字约束的定义

sql server中动态sql语句的应用

SQL Server删除视图的两种方法

SQL SERVER视图对查询效率的提高

带您了解sql server内部变量

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...