A implantação da solução falha com o erro “Violação da restrição PRIMARY KEY 'PK_Classes'”

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/72560

  •  10-12-2019
  •  | 
  •  

Pergunta

Em nosso script de instalação, que instala várias soluções juntas, descobrimos que ocasionalmente as soluções falhavam na implantação com o seguinte erro no log do ULS:

System.Data.SqlClient.SqlException:Violação da restrição de chave primária 'PK_Classes'.Não é possível inserir a chave duplicada no objeto 'dbo.classes'.

Isso ocorre tanto com o Powershell quanto com o stsadm.

Foi útil?

Solução

Tínhamos uma lógica que chamava Install-SPSolution duas vezes em soluções diferentes (mesmo comportamento observado com stsadm) e, em seguida, uma lógica para aguardar a conclusão da implantação.Em casos raros, o que aconteceu foi que ambas as soluções tentavam adquirir o bloqueio de implantação antes que qualquer um dos threads conseguisse o bloqueio;um thread seria bem-sucedido e outro falharia com a exceção de chave primária.

Então o log ficaria assim:

Solution Deployment : Acquiring deployment job lock for server ... solutionA.wsp  
Solution Deployment : Acquiring deployment job lock for server ... solutionB.wsp  
Solution Deployment : Successfull ACQUIRED deployment job lock for server ... solutionA.wsp 
System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK_Classes'. Cannot insert duplicate key in object 'dbo.Classes'.

Em vez de:

Solution Deployment : Acquiring deployment job lock for server ... solutionA.wsp  
Solution Deployment : Successfull ACQUIRED deployment job lock for server ... solutionA.wsp 
Solution Deployment : Acquiring deployment job lock for server ... solutionB.wsp

(seguido pela solução B sendo negada e aguardando a conclusão da solução A)

A solução é instalar uma solução, aguardar a conclusão e depois instalar outra.Há alguns exemplos de como esperar usando a propriedade JobExists na solução aqui: Detectando o status de implantação da solução.Não é realmente mais lento fazer isso dessa maneira (não mais do que o intervalo de espera), porque nos bastidores o SharePoint executa um trabalho e depois o outro de qualquer maneira, quando os bloqueios são adquiridos corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top