当文档似乎说它不会时,在表上使用 sp_rename 会更新表的外键

Hop*_*ess 4 t-sql sql-server

我一定是误解了微软的文档,因为它说

重命名表不会自动重命名对该表的引用。您必须手动修改引用重命名表的任何对象。

但是,当我在表上运行时sp_rename,除了重命名表之外,它还更改了连接到表的外键。我不是在抱怨,因为它们需要改变,我只是很困惑为什么它说的是一件事,然后又做了另一件事。外键为什么不是对象?sp_rename 文档似乎说它是一个对象......

sys.objects 中跟踪的类型的项目。例如,OBJECT 可用于重命名对象,包括约束(CHECK、FOREIGN KEY、PRIMARY/UNIQUE KEY)、用户表和规则。

cli*_*n_h 5

根据sp_rename的文档

重命名存储过程、函数、视图或触发器不会更改 sys.sql_modules 目录视图的定义列中相应对象名称的名称

还有下一段:

重命名对象(例如表或列)不会自动重命名对该对象的引用。您必须手动修改引用重命名对象的任何对象。例如,如果您重命名表列并且触发器中引用了该列,则必须修改触发器以反映新的列名称

[sys].[sql_modules]视图文档说:

P、RF、V、TR、FN、IF、TF 和 R 类型的对象具有关联的 SQL 模块。独立默认值,D 类型的对象,在此视图中也有 SQL 模块定义

查看sys.objects.[type]的定义,我们看到

  • P = 存储过程
  • RF = 复制过滤器过程
  • V = 视图
  • TR = 触发
  • FN = SQL 标量函数
  • IF = SQL 内联表值函数
  • TF = SQL 表值函数
  • R = 规则(旧式,独立)
  • D = 默认

请注意其中每一个都是预先编写脚本的SQL 语句。

我们还知道,可以sp_rename重命名关联索引及其 PRIMARY 约束,还可以重命名主 XML 索引和辅助 XML 索引。

基本上,数据库必须强制执行完整性,并且能够重命名列而不重命名依赖列将彻底破坏数据库。

sp_rename因此,按照您所注意到的那样做是完全有道理的。