none
Não consigo alterar tipo do campo RRS feed

  • Pergunta

  • Boa noite pessoal,

    Tenho algumas tabelas replicadas (replicação transactional) e em uma delas, preciso alterar o tipo de um campo, passando-o de MONEY para VARCHAR.
    Ocorre que ao tentar fazer este procedimento, retorna a seguinte mensagem de erro: "Cannot drop the table 'dbo.TPEDIDO' because it is being used for replication".
    Existe alguma forma de se alterar o tipo de campo sem dropar a replicação?

    No aguardo, desde já agradeço.

    Um grande abraço à todos.
    segunda-feira, 15 de dezembro de 2008 23:05

Respostas

  • Bom dia Gustavo,

    Obrigado pelo rápido retorno.
    Se eu seguir a sua sugestão, como eu devo proceder para retirar da replicação, apenas a tabela que eu desejo alterar o tipo do campo?

    No aguardo, desde já agradeço.


    terça-feira, 16 de dezembro de 2008 09:50
  • Bom dia Demétrio,

    Obrigado pelo rápido retorno também.
    Esqueci de mencionar... a versão de SQL que eu utilizo é o 2000.
    Vou seguir a sugestão de retirar a tabela e inserí-la novamente posteriormente.
    Depois eu aviso se deu certo.

    Um grande abraço e obrigado novamente.
    terça-feira, 16 de dezembro de 2008 09:55

Todas as Respostas

  • Boa Noite Murith,

     

    Seja bem vindo ao fórum de SQL Server do MSDN.

     

    Nós participantes do fórum teremos prazer em ajudá-lo com suas dúvidas e problemas relacionados ao SQL Server através de nosso conhecimento, experiência e disponibilidade.

     

    Infelizmente a replicação do SQL Server impõe algumas restrições e quando as tabelas estão replicadas não é possível alterar o seu schema. O que você pode fazer para minimizar o impacto é retirar apenas essa tabela da replicação e quando for apropriado incluí-la novamente.

     

    [ ]s,

     

    Gustavo

    terça-feira, 16 de dezembro de 2008 00:19
  • Olá,

     

    Gostei da thread.

     

    Murith para replicações a partir do Sql 2005, as alterações em esquema são propagadas para os assinantes automaticamente. O que acontece é que você está tentando fazer a alteração via SSMS e o SSMS pode estar tentanto dropar e recriar a table, tente fazer via TSQL

     

    tipo: ALTER TABLE TB_TESTE ALTER COLUMN C_TESTE CHAR(2).

     

    Caso esteja usando o SQL 2000 ou inferior, e não saiba ou não quer retirar e colocar novamente a tabela na replicação, você pode fazer o seguinte ( lembrando que isso gera um overhead muito grande, dependendo do tamanho de sua table ):

     

    1 - Adicionar um novo campo com o nome "destino"  e com o tipo de dados desejado

     

    2 - Fazer um update do campo desejado para este campo

    update tabela set destino = campoOrigem

     

    3 - Dropar o campo "campoOrigem"

     

    4 - Criar novamente o campo "campoOrigem", agora com o tipo de dado desejado

     

    5 - Fazer um update do campo desejado para este campo

    update tabela set campoOrigem = destino 

     

    6 - Dropar o campo criado "destino".

     

    Com esses passos, você terá realizdo a alteração do tipo de campo. Ou então você pode retirar e colocar a tabela novamente n replicação como citado pelo Gustavo.

     

    Para adicionar e remover campos no Sql Server 2000, use as SPs: sp_repladdcolumn  e sp_repldropcolumn, respectivamente. Para o caso do Sql ser a partir do 2005, basta usar o código TSQL listado no início da thread.

     

    Note que a replicação a partir do SQL Server 2005, teve uma melhoria enorme em relação ao SQL Server 2000.

     

    Abraços

     

    terça-feira, 16 de dezembro de 2008 02:12
  • Bom dia Gustavo,

    Obrigado pelo rápido retorno.
    Se eu seguir a sua sugestão, como eu devo proceder para retirar da replicação, apenas a tabela que eu desejo alterar o tipo do campo?

    No aguardo, desde já agradeço.


    terça-feira, 16 de dezembro de 2008 09:50
  • Bom dia Demétrio,

    Obrigado pelo rápido retorno também.
    Esqueci de mencionar... a versão de SQL que eu utilizo é o 2000.
    Vou seguir a sugestão de retirar a tabela e inserí-la novamente posteriormente.
    Depois eu aviso se deu certo.

    Um grande abraço e obrigado novamente.
    terça-feira, 16 de dezembro de 2008 09:55
  • Olá Murith,

     

    Em primeiro lugar gistaría de solicitar que você marque como resposta a(s) entrada(s) que realmente lhe ajudou e não sua prórpia entrada.

     

    Para dropar uma table de uma replicação transacional basta executar a procedure:

     

    EXEC sp_droparticle
      @publication = @publication, --nome de sua publicação
      @article = @article,--nome da table
      @force_invalidate_snapshot = 1;--deixe 1 para informar que esta operação vai invalidar o snapshot.

     

    Abraços

    terça-feira, 16 de dezembro de 2008 21:16