巧对sql server外键重命名

数据库 SQL Server
如果数据库的外键约束命名不尽如人意,应该如何修改呢?下文就以实例的方式为您详解sql server外键重命名的方法,希望对您有所启迪。

sql server外键如果不合我们的心意,能不能进行重命名呢?答案是肯定的。下文的例子就将为您示范sql server外键如何进行重命名,供您参考。

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

采用的命名规则是:

  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.  
  3. select   
  4.  
  5. OBJECT_NAME(col.constraint_object_id) as FKConstraintName    
  6.  
  7. ,fkTable.name as FKTable    
  8.  
  9. ,fkCol.name as FKColumn    
  10.  
  11. ,pkTable.name as PKTable    
  12.  
  13. ,pkCol.name as PKColumn    
  14.  
  15. from sys.foreign_key_columns col    
  16.  
  17. -- 外键约束是建立在外键表上的,    
  18.  
  19. -- 因此foreign_key_columns表中的parent_object_id和parent_column_id分别表示外键表和外键列    
  20.  
  21. inner join sys.objects fkTable    
  22.  
  23.     on fkTable.object_id = col.parent_object_id    
  24.  
  25. inner join sys.columns fkCol    
  26.  
  27.     on fkCol.column_id = col.parent_column_id    
  28.  
  29.     and fkCol.object_id = fkTable.object_id    
  30.  
  31. -- foreign_key_columns表中的referenced_object_id和referenced_column_id分别指向    
  32.  
  33. -- 外键约束的主键表对象以及主键列    
  34.  
  35. inner join sys.objects pkTable    
  36.  
  37.     on pkTable.object_id = col.referenced_object_id    
  38.  
  39. inner join sys.columns pkCol    
  40.  
  41.     on pkCol.column_id = col.referenced_column_id    
  42.  
  43.     and pkCol.object_id = pkTable.object_id    
  44.  
  45. order by OBJECT_NAME(col.constraint_object_id)    
  46.  
  47.      
  48.  
  49. open fkcur    
  50.  
  51. declare @constraintName nvarchar(128)    
  52.  
  53. declare @fkTable nvarchar(64)    
  54.  
  55. declare @fkColumn nvarchar(64)    
  56.  
  57. declare @pkTable nvarchar(64)    
  58.  
  59. declare @pkColumn nvarchar(64)    
  60.  
  61. declare @newConstraintName nvarchar(128)    
  62.  
  63.      
  64.  
  65. fetch next from fkcur    
  66.  
  67. into @constraintName,@fkTable,@fkColumn,@pkTable,@pkColumn    
  68.  
  69. while @@FETCH_STATUS = 0    
  70.  
  71. begin   
  72.  
  73.     set @newConstraintName = 'FK_'+@fkTable+'_'+@pkTable+'_On_'+@fkColumn    
  74.  
  75.     exec sp_rename @constraintName,@newConstraintName,'Object'   
  76.  
  77.      
  78.  
  79.     fetch next from fkcur    
  80.  
  81.     into @constraintName,@fkTable,@fkColumn,@pkTable,@pkColumn    
  82.  
  83. end   
  84.  
  85. close fkcur    
  86.  
  87. deallocate fkcur   

 

 

 

【编辑推荐】

教您sql server外键的设置和删除

sqlserver分页存储过程实例

sql server分页的两种方法比较

SQL SERVER分区视图

带您解读SQL Server2008中的TIME数据类型

责任编辑:段燃 来源: 博客
相关推荐

2010-11-12 15:19:06

Sql Server外

2010-10-19 17:28:08

SQL SERVER外

2010-06-17 17:50:31

SQL Server外

2010-09-13 13:44:22

sql server外

2010-09-25 13:16:51

SQL Server外

2010-09-13 14:05:09

sql server外

2010-11-10 11:37:29

SQL Server删

2010-09-25 11:50:47

sql server外

2010-09-13 13:25:44

sql server外

2010-09-13 13:58:29

sql server外

2010-06-18 08:30:48

SQL Server

2010-09-28 11:38:26

sql字段

2011-07-26 18:06:00

SQL Server数批量重命名

2010-12-01 11:29:11

职场

2010-11-19 13:48:18

2011-03-14 13:18:41

SQL Server数权限

2010-09-02 10:02:06

SQL删除

2011-04-18 13:02:08

SQL Server SQL Server

2009-12-22 15:28:51

Linux批量重命名文

2011-03-04 09:48:21

PureFTPd
点赞
收藏

51CTO技术栈公众号