Quero modificar uma chave primária existente em uma tabela do SQL Azure.
Atualmente, tem uma coluna e quero adicionar outra.
Agora, no SQL Server 2008, isso foi fácil, apenas no SSMS, puf. Feito. É assim que o PK se parece se eu o script no SQL Server:
ALTER TABLE [dbo].[Friend] ADD CONSTRAINT [PK_Friend] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[Id] ASC
)
No entanto, no SQL Azure, quando tento executar o acima, é claro que falhará:
Table 'Friend' already has a primary key defined on it.
Tudo bem, então eu tento soltar a chave:
Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.
Ok, então eu tento criar um índice clusterizado temporário para descartar o PK:
CREATE CLUSTERED INDEX IX_Test ON [Friend] ([UserId],[Id])
O que resulta em:
Cannot create more than one clustered index on table 'Friend'. Drop the existing clustered index 'PK_Friend' before creating another.
Ótimo, um momento difícil.
Como adiciono a coluna UserId ao meu PK existente?
fonte
Respostas:
Nota: a partir do Banco de Dados SQL do Azure v12, essas restrições não se aplicam mais.
O "índice primário" não existe. Existe uma "chave primária" e também um "índice de cluster". Conceitos distintos, frequentemente confusos. Com essa distinção em mente, vamos revisitar a questão:
Q1) O índice clusterizado em uma tabela do SQL Azure pode ser modificado?
A: sim Use
WITH (DROP_EXISTING=ON)
:Q2) O índice clusterizado de uma tabela que possui uma restrição de chave primária pode ser modificado?
R: Sim, o mesmo que acima, desde que a restrição de chave primária não seja imposta pelo índice clusterizado:
Q3) A restrição de chave primária de uma tabela pode ser modificada?
R: Sim, desde que a restrição principal não seja imposta pelo índice clusterizado:
Q4) A chave primária de uma tabela pode ser modificada quando aplicada pelo índice de cluster?
A: Sim, se a tabela nunca teve nenhuma linha:
Q5) A chave primária de uma tabela pode ser modificada quando aplicada pelo índice de cluster se a tabela for preenchida?
R: Não. Qualquer operação que converta um índice clusterizado preenchido em um heap será bloqueada no SQL Azure, mesmo se a tabela estiver vazia :
Como observação lateral: a restrição pode ser modificada se a tabela estiver truncada .
A solução alternativa para alterar a restrição PK de uma tabela preenchida é fazer o bom e velho
sp_rename
truque:A
sp_rename
abordagem tem alguns problemas, o mais importante é que as permissões na tabela não são transferidas durante a renomeação, além de restrições de chave estrangeira.fonte