重命名 Azure 上的主键约束

tra*_*max 7 sql-server azure-sql-database

我正在尝试更改 Azure 存储中表的主键。计划是创建一个新表,移动数据并删除旧表。问题是我需要所有约束名称都与旧的相同。

因此,在重命名旧表和该表上的所有约束之前,我无法创建新表。我已经在约束上尝试过 sp_rename,但没有运气:

sp_rename 'PK_dbo.ContactSessions', 'PK_dbo.ContactSessions_old', 'OBJECT'
Run Code Online (Sandbox Code Playgroud)

给我:

Either the parameter @objname is ambiguous or the claimed @objtype (OBJECT) is wrong.
Run Code Online (Sandbox Code Playgroud)

如果我像这样运行 sp_rename:

sp_rename 'PK_dbo.ContactSessions', 'PK_dbo.ContactSessions_old'
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

No item by the name of 'PK_dbo.ContactSessions' could be found in the current database 'testing_only', given that @itemtype was input as '(null)'.
Run Code Online (Sandbox Code Playgroud)

我看过这个帖子:如何更改 SQL Azure 上的现有主键? 并尝试

create clustered index [NEW_INDEX_NAME] on [ContactSessions] ([ContactSessionId]) 
    with (drop_existing=on);
Run Code Online (Sandbox Code Playgroud)

并得到错误:

Could not find any index named 'NEW_INDEX_NAME' for table 'ContactSessions'.
Run Code Online (Sandbox Code Playgroud)

还有其他选项可以更改索引名称吗?

我知道这是可能的,因为我可以右键单击 SSMS 中的密钥名称并重命名该密钥,但我需要在脚本中使用它。

Jon*_*gel 8

分隔所有标识符是一种很好的做法。在这种特殊情况下,您说PK_dbo前缀实际上是索引名称的一部分。因此,名称必须适当分隔,否则无法明确解析。

此外,实际重命名的是索引,而不是对象。

这应该在填写空白后工作:

sp_rename '[<schema>].[<table>].[PK_dbo.ContactSessions]', 'ContactSessions_old', 'INDEX';
Run Code Online (Sandbox Code Playgroud)

我不会CREATE INDEX ... WITH(DROP_EXISTING = ON)为此使用它,因为它会在物理上重新创建索引,这在这种情况下是不必要的。此构造最适用于需要更改索引定义同时保留名称的情况。