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 中的密钥名称并重命名该密钥,但我需要在脚本中使用它。
分隔所有标识符是一种很好的做法。在这种特殊情况下,您说PK_dbo前缀实际上是索引名称的一部分。因此,名称必须适当分隔,否则无法明确解析。
此外,实际重命名的是索引,而不是对象。
这应该在填写空白后工作:
sp_rename '[<schema>].[<table>].[PK_dbo.ContactSessions]', 'ContactSessions_old', 'INDEX';
Run Code Online (Sandbox Code Playgroud)
我不会CREATE INDEX ... WITH(DROP_EXISTING = ON)为此使用它,因为它会在物理上重新创建索引,这在这种情况下是不必要的。此构造最适用于需要更改索引定义同时保留名称的情况。