我正在根据另一个问题的答案中提供的输入探索 MSSQL 中的sp_rename过程。
我有大约 50 个表,这些表都带有 UID 列,且具有随机唯一约束名称,如“UQ__tblAssig__C5B19603C906D5BE”。我想将所有表的这些约束重命名为 I_UID,以符合不同表中使用的其他索引。请注意,索引 [I_UID] 之前不存在于任何表中。运行这三行中的第一行工作正常,我在 tblAssignmentType 的索引文件夹中获得了索引 I_UID。
EXEC sp_rename N'[tblAssignmentType].[UQ__tblAssig__C5B19603C906D5BE]', N'[I_UID]', N'INDEX';
EXEC sp_rename N'[tblProduct].[UQ__tblProdu__C5B196034878474D]', N'[I_UID]', N'INDEX';
EXEC sp_rename N'[tblAssignment].[UQ__tblAssig__C5B196031B17A97B]', N'[I_UID]', N'INDEX';
但是,当我运行下一行时,我收到以下错误消息:
Msg 15335, Level 11, State 1, Procedure sp_rename, Line 733 [Batch Start Line 38]
Error: The new name '[I_UID]' is already in use as a INDEX name and
would cause a duplicate that is not permitted.
但在 tblProduct 中我没有名为 I_UID 的索引。因此我怀疑之前的重命名语句在全局范围内创建了 I_UID 索引,即使它出现在正确的表中。
这就让我想到了一个问题:我可以使用什么样的语法与 sp_rename 来指定新名称应包含在某个表的范围内,以便以后相同的本地名称也可以用于其他表?
索引名称的范围已经仅限于表。您的问题是,这些是约束,而不仅仅是索引,重命名索引也会重命名相关的约束 - 并且约束名称是架构范围的。(示例)如果这个命名对您很重要,您需要将它们替换为未作为约束创建的唯一索引。
我认为没有任何方法可以将唯一约束转换为简单的解耦唯一索引作为仅元数据的操作。
您需要这样做
然后放弃不必要的限制
YourTable
您还应该检查现有的约束。文档说:
UQ_DF_tblSomeTable_UID
因此,如果我尝试从这张图片重命名索引:使用此命令:
它会引发错误: