Estou explorando o procedimento sp_rename no MSSQL com base na entrada fornecida em uma resposta a outra pergunta.
Tenho cerca de 50 tabelas que foram criadas com uma coluna UID tendo um nome de restrição exclusivo aleatório como "UQ__tblAssig__C5B19603C906D5BE". Quero renomear essas restrições para exatamente I_UID para todas as tabelas para cumprir com outros índices usados nas diferentes tabelas. Observe que o índice [I_UID] não está presente em nenhuma das tabelas de antemão. Executar a primeira dessas três linhas funciona bem, e obtenho um índice I_UID na pasta de índice de tblAssignmentType.
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';
Entretanto, quando executo uma das próximas linhas, recebo a seguinte mensagem de erro:
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.
Mas em tblProduct eu não tenho um índice chamado I_UID. Portanto, suspeito que a declaração de renomeação anterior fez um índice I_UID no escopo global, mesmo que ele apareça na tabela correta.
O que me leva à pergunta: que tipo de sintaxe eu poderia usar com sp_rename para especificar que o novo nome deveria estar contido dentro do escopo de uma determinada tabela de tal forma que o mesmo nome local também pudesse ser usado para outras tabelas posteriormente?
Os nomes de índice já estão no escopo apenas de uma tabela. Seu problema é que essas são restrições, não apenas índices, e renomear o índice também renomeia a restrição associada - e os nomes de restrição são no escopo do esquema. ( Exemplo ) Se essa nomenclatura for importante para você, você precisa substituí-los por índices exclusivos não criados como restrições.
Não creio que haja nenhuma maneira de fazer essa conversão de uma restrição exclusiva em um índice exclusivo desacoplado simples como uma operação somente de metadados.
Você precisaria fazer isso como
E então elimine a restrição indesejada em
YourTable
Você deve verificar também as restrições existentes. O documento diz:
Portanto, se eu tentar renomear o índice
UQ_DF_tblSomeTable_UID
desta imagem:Usando este comando:
Ele gera o erro: