操作方法:自动重命名数据库中的外键






4.28/5 (7投票s)
使用 T-SQL 和系统视图/存储过程来为数据库中的每个关系赋予一致的名称
引言
本文介绍了如何自动重命名数据库中的每个关系。
如果您的数据库是从不同的 DBMS 升级而来,并且关系名称没有意义(例如 Access 升级就是这样),或者这些名称是多年前由使用不同标准的开发人员创建的,或者如果您重命名了数据库中的一个或多个表,并且需要同时修复外键的名称,那么这将非常有用。
背景
这个想法(以及底层的算法)很简单
获取数据库中的所有关系,查看关系中涉及的表,并为每个表赋予名称 "FK_ParentTable_ForeignTable[Counter]
"。
在之前的 SQL Server 版本中,这更容易,因为用户可以直接更新(使用单个语句)系统目录,但在 SQL Server 2005 中,出于一致性的原因,此功能已被禁用。
在 SQL Server 2005 中,有很多有用的视图位于系统目录之上,让用户了解每个数据库中的所有内容。 该代码使用这些视图来完成任务。
Using the Code
该代码只是一个 T-SQL 代码块,因此您可以
- 将其粘贴到“Management Studio”窗口中并从中运行。
- 将其作为存储过程的主体放置,以便在需要时调用。
- 从“数据库更新”脚本中运行。
- ... 做任何您用来运行 SQL 批处理的事情。
关注点
此代码使用了 SQL Server 2005 的一些新功能。
为了使代码更简单,使用**公共表表达式** (CTE) 在逻辑上对其进行了划分。
此外,为了正确计算外键,使用了**排序函数**。
所以如果您是新手,您可以学到一些东西。 :)
深入了解
逻辑很简单:获取数据库中实际外键的列表,并使用 sp_rename
扩展过程重命名它们。 因此,该代码基本上是一个查询,它包装在一个过程代码周围,该过程代码循环遍历结果集并执行重命名工作。 该过程中没有重要/特殊/困难之处需要指出……有趣的部分是下面详细解释的查询。
首先,我们需要获取数据库中存在的每个外键。
视图 sys.foreign_key_columns
包含“什么列链接到什么其他列”的信息。 我们使用此视图来获取每个不同关系的列表(一个关系可能采用多个列)。 第一个 CTE 包含此信息。
接下来,我们应该将对象 ID 转换为对象名称。
这可以通过将第一个 CTE 与 sys.objects
视图连接来完成。
此外,我们可以统计父表与引用表关联的次数。
此 CTE 存储
- 实际关系名称
- 父表
- 引用表,以及
- 计数器
第三步是将第二步中获得的信息转换为更有用的东西:旧关系名称和新关系名称。CASE
用于在存在多个关系或只有一个关系时放入或省略计数器(如果您想要不同的重命名方案,您可以轻松地对其进行修改)。
第四步用于(对于重命名过程)仅考虑尚不存在的关系名称(因为可能有人已经手动修复了其中的一些关系名称,或者它们是使用正确的名称创建的)。
欢迎提供任何提示/评论......如果您觉得这篇文章有用,请不要忘记评价它。 :)
历史
我一直讨厌历史……我更喜欢即将发生的事情……:)