locked
Sobre a coluna rowguide RRS feed

  • Pergunta

  • Bom dia pessoal,


    Estou com um problemão.

    Eu fiz a replicação Merge do banco de dados e deu ok, só que a aplicação não funcionou por causa da coluna Rowguide que é criada automaticamente pela replicação.  Será que vai ter mesmo que alterar na aplicação toda? Ou tem alguma outra saida?

    Outro problema: Tive que excluir essa coluna pelo enterprise uma por tabela...Pois o script não dá certo..Olha o script:

    alter table category
    drop column rowguid

    Aí ele dá erro:

    Server: Msg 5074, Level 16, State 1, Line 1
    The object 'DF__category__rowgui__73852659' is dependent on column 'rowguid'.
    Server: Msg 5074, Level 16, State 1, Line 1
    The index 'index_549576996' is dependent on column 'rowguid'.
    Server: Msg 4922, Level 16, State 1, Line 1
    ALTER TABLE DROP COLUMN rowguid failed because one or more objects access this column.

    Alguém já passou por isso?

    Agradeço se alguem puder me ajudar.


    Obrigada a todos.

     

     

    sexta-feira, 7 de julho de 2006 12:38

Respostas

  • O problema não está relacionado ao uso exclusivo do banco de dados e sim que a coluna ROWGUID possui um default e também um índice, então você deve excluir o índice, depois o default e depois a coluna ROWGUID (nesta sequência)....

     

    Segue script para isso.... (peguei como base o script postado neste site...)

     

    print 'Apagando os índices das colunas ROWGUID'
    Declare @NomeIndice nvarchar(129) , @NomaTabelaIndex nvarchar(129), @CmdSqlInd nvarchar(129)
    DECLARE list_rowguid_Index CURSOR FOR
    select sysindexes.name as NomeIndex, sysobjects.name as NomeTabIndex
    from syscolumns,
    sysobjects,sysusers , sysindexes
    where syscolumns.name like 'rowguid' and
    object_Name(sysobjects.id) not like 'msmerge%'
    and sysobjects.id=syscolumns.id
    and sysusers.uid=sysobjects.uid
    and sysindexes.id = sysobjects.id
    and sysobjects.type='u' AND sysindexes.name LIKE 'index_%'

    OPEN list_rowguid_Index
    FETCH NEXT FROM list_rowguid_Index INTO @NomeIndice, @NomaTabelaIndex
    WHILE @@FETCH_STATUS = 0
    BEGIN
    PRINT 'Apagando o índice' +@NomeIndice + ' da tabela ' + rtrim(@NomaTabelaIndex )
    select @CmdSqlInd='drop index ' + rtrim(@NomaTabelaIndex ) + '.'+ rtrim(@NomeIndice )
    print @CmdSqlInd
    EXEC sp_executesql @CmdSqlInd


    FETCH NEXT FROM list_rowguid_Index INTO @NomeIndice, @NomaTabelaIndex
    END

    CLOSE list_rowguid_Index
    DEALLOCATE list_rowguid_Index

     

    Declare @NomeDefault nvarchar(129) , @NomaTabela nvarchar(129), @CmdSqlDef nvarchar(129), @CmdSqlCol nvarchar(129)
    DECLARE list_rowguid_columns  CURSOR FOR

    SELECT  df.name as NomeDefault, tb.name as NomeTabela
    FROM sysobjects df
    join sysobjects tb on df.parent_obj = tb.id
    WHERE df.type = 'D' and tb.type='u' AND df.parent_obj IN
    (select syscolumns.id from syscolumns,
    sysobjects,sysusers where syscolumns.name like 'rowguid' and
    object_Name(sysobjects.id) not like 'msmerge%'
    and sysobjects.id=syscolumns.id
    and sysusers.uid=sysobjects.uid
    and sysobjects.type='u')
    and df.name like '%rowgu%'


    OPEN list_rowguid_columns
    FETCH NEXT FROM list_rowguid_columns INTO @NomeDefault, @NomaTabela
    WHILE @@FETCH_STATUS = 0
    BEGIN
    PRINT 'Apagando o default' +@NomeDefault
    select @CmdSqlDef='Alter Table ' + rtrim(@NomaTabela ) + ' DROP CONSTRAINT '+ rtrim(@NomeDefault )
    print @CmdSqlDef
    EXEC sp_executesql @CmdSqlDef

    PRINT 'Apagando a coluna ROWGUID da tabela  ' +@NomaTabela
    select @CmdSqlCol='Alter Table ' + rtrim(@NomaTabela ) + ' drop column rowguid'
    print @CmdSqlCol
    EXEC sp_executesql @CmdSqlCol

    FETCH NEXT FROM list_rowguid_columns INTO @NomeDefault, @NomaTabela
    END

    CLOSE list_rowguid_columns
    DEALLOCATE list_rowguid_columns

     

     

    • Marcado como Resposta Gabriel Marquez quarta-feira, 11 de março de 2009 18:42
    quarta-feira, 2 de maio de 2007 15:08

Todas as Respostas

  • Realmente Rita, ela e obrigatoria mesmo. nao tem como nao ter, infelizmente a sua aplicacao tera que ser modificada, e o erro ocorre geralmente ao usar * em inserts ou nao fixar os campos nas consultas, etc. ( que e um item recomendado ).

     

    qualquer coisa retorne.

     

    Abs;

    sexta-feira, 7 de julho de 2006 12:46
  • putz....Então já falei para os desenvolvedores alterar...

    Eles tem mania de colocar o * e não os campos mesmo...Já cansei de falar para não fazer isso....Alias tb não é recomendado por causa da perfomance...

    Outra coisa:

    Qdo fui tentar deletar o rowguide pelo script ele dá erro...

    Server: Msg 5074, Level 16, State 1, Line 1
    The object 'DF__category__rowgui__73852659' is dependent on column 'rowguid'.
    Server: Msg 5074, Level 16, State 1, Line 1
    The index 'index_549576996' is dependent on column 'rowguid'.
    Server: Msg 4922, Level 16, State 1, Line 1
    ALTER TABLE DROP COLUMN rowguid failed because one or more objects access this column.

    E o script é:


    alter table category
    drop column rowguid

     

    Obrigada pela ajuda,


     

     

    sexta-feira, 7 de julho de 2006 12:51
  • Rita,

    O Trabalho ficou agora para os analistas pois a modificação fica a nivel de aplicação mesmo, o rowguide não pode ser deletado, aconselho a testar a aplicação como um todo para ver onde esta os erros e modificar os selects e trabalho-so mais necessario, vai ter ate ganho na performance no banco depois disso.

     

    Qualquer coisa retorna.

    sexta-feira, 7 de julho de 2006 12:53
  • Obrigada Daniel,

    Então eu precisei excluir a replicação....só para não parar de funcionar..E os analistas vão fazer a modificação sim, mas por enquanto tenho que deixar funcionando a aplicação.

    Então outro problema, na hora de excluir o rowguide...

    alter table category
    drop column rowguid

    Aí ele dá erro:

    Server: Msg 5074, Level 16, State 1, Line 1
    The object 'DF__category__rowgui__73852659' is dependent on column 'rowguid'.
    Server: Msg 5074, Level 16, State 1, Line 1
    The index 'index_549576996' is dependent on column 'rowguid'.
    Server: Msg 4922, Level 16, State 1, Line 1
    ALTER TABLE DROP COLUMN rowguid failed because one or more objects access this column.

    Você sabe o que está acontecendo?

    Obrigada mais uma vez,

    Rita

    sexta-feira, 7 de julho de 2006 12:58
  • pra poder dropar as colunas guid vc. tem que desabilitar a replicaca e usar

    sp_removedbreplication 'nome_banco'

     

    depois vc. podera dropar sem problemas.

     

    Abs;

    sexta-feira, 7 de julho de 2006 12:59
  • Marcelo já desabilitei sim...

    Até rodei

    sp_removedbreplication 'nome_banco'

    e mesmo assim continua com o erro na hora de dropar a coluna...Só consigo fazer pelo enterprise no designer...

     

    Obrigada

    sexta-feira, 7 de julho de 2006 13:02
  • Rita,

    beleza então vai tirar a replicação nesse caso olha a storedprocedure : sp_removedbreplication e no mais esse script  vai ter ajudar.

    Declare @name nvarchar(129)
    DECLARE list_rowguid_columns CURSOR FOR
    select sysusers.name+'.'+object_name(syscolumns.id) from syscolumns,
    sysobjects,sysusers where syscolumns.name like 'rowguid' and
    object_Name(sysobjects.id) not like 'msmerge%'
    and sysobjects.id=syscolumns.id
    and sysusers.uid=sysobjects.uid
    and sysobjects.type='u' order by 1

    OPEN list_rowguid_columns

    FETCH NEXT FROM list_rowguid_columns INTO @name
    WHILE @@FETCH_STATUS = 0
    BEGIN
    PRINT 'dropping rowguid columns ' +@name
    select @name='Alter Table ' + rtrim(@name ) + ' drop column rowguid'
    print @name
    EXEC sp_executesql @name
    FETCH NEXT FROM list_rowguid_columns INTO @name
    END

    CLOSE list_rowguid_columns
    DEALLOCATE list_rowguid_columns
    go

    Espero ter ajudado.

    sexta-feira, 7 de julho de 2006 13:07
  • Daniel,

    Rodei o script e deu o mesmo erro....

    Obrigada pelos scripts..

    Abços,

    sexta-feira, 7 de julho de 2006 13:11
  • e que vc. vai ter que deletar as contraints e proc da replicacao antes de poder dropar a coluna.

     

    vai ser um trabalho complicado, para agiliazar selecione a tabela veja as dependencias apostadas para a coluna e delete elas primeiro.

     

    Abs

     

     

    sexta-feira, 7 de julho de 2006 13:23
  • Putz...

    O estranho que consigo dropar pelo enterprise....então é mais ´prático fazer assim...rsrsrsrsrs

    Valeu pelo retorno...

     

    Abços,

     

    sexta-feira, 7 de julho de 2006 13:32
  • Rita,

    Mas você executou a sp_removedbreplication 'banco' depois disso você poderia rodar o script e deletar ou deletar manualmente se prefirir.

    Da um retorno do seu caso para ver o que podemos fazer.

    Espero ter ajudado.

     

     

    sexta-feira, 7 de julho de 2006 13:58
  • Daniel,

    Já deletei manualmente e rodei o script sp_removedbreplication 'banco'.

    E rodei o script q vc mandou...Deu o mesmo erro...

    Hum, estranho...

    Obrigada pela ajuda,

     

     

    sexta-feira, 7 de julho de 2006 14:04
  • Rita ,

    Bem qualquer coisa espere um horario que você pode colocar o banco em modo exclusivo e tente fazer isso pois algum usuario deve estar locando os objetos : sp_lock para ver os locks do banco.

    Pois ja deveria ter conseguido excluir.

     

    sexta-feira, 7 de julho de 2006 14:10
  • O problema não está relacionado ao uso exclusivo do banco de dados e sim que a coluna ROWGUID possui um default e também um índice, então você deve excluir o índice, depois o default e depois a coluna ROWGUID (nesta sequência)....

     

    Segue script para isso.... (peguei como base o script postado neste site...)

     

    print 'Apagando os índices das colunas ROWGUID'
    Declare @NomeIndice nvarchar(129) , @NomaTabelaIndex nvarchar(129), @CmdSqlInd nvarchar(129)
    DECLARE list_rowguid_Index CURSOR FOR
    select sysindexes.name as NomeIndex, sysobjects.name as NomeTabIndex
    from syscolumns,
    sysobjects,sysusers , sysindexes
    where syscolumns.name like 'rowguid' and
    object_Name(sysobjects.id) not like 'msmerge%'
    and sysobjects.id=syscolumns.id
    and sysusers.uid=sysobjects.uid
    and sysindexes.id = sysobjects.id
    and sysobjects.type='u' AND sysindexes.name LIKE 'index_%'

    OPEN list_rowguid_Index
    FETCH NEXT FROM list_rowguid_Index INTO @NomeIndice, @NomaTabelaIndex
    WHILE @@FETCH_STATUS = 0
    BEGIN
    PRINT 'Apagando o índice' +@NomeIndice + ' da tabela ' + rtrim(@NomaTabelaIndex )
    select @CmdSqlInd='drop index ' + rtrim(@NomaTabelaIndex ) + '.'+ rtrim(@NomeIndice )
    print @CmdSqlInd
    EXEC sp_executesql @CmdSqlInd


    FETCH NEXT FROM list_rowguid_Index INTO @NomeIndice, @NomaTabelaIndex
    END

    CLOSE list_rowguid_Index
    DEALLOCATE list_rowguid_Index

     

    Declare @NomeDefault nvarchar(129) , @NomaTabela nvarchar(129), @CmdSqlDef nvarchar(129), @CmdSqlCol nvarchar(129)
    DECLARE list_rowguid_columns  CURSOR FOR

    SELECT  df.name as NomeDefault, tb.name as NomeTabela
    FROM sysobjects df
    join sysobjects tb on df.parent_obj = tb.id
    WHERE df.type = 'D' and tb.type='u' AND df.parent_obj IN
    (select syscolumns.id from syscolumns,
    sysobjects,sysusers where syscolumns.name like 'rowguid' and
    object_Name(sysobjects.id) not like 'msmerge%'
    and sysobjects.id=syscolumns.id
    and sysusers.uid=sysobjects.uid
    and sysobjects.type='u')
    and df.name like '%rowgu%'


    OPEN list_rowguid_columns
    FETCH NEXT FROM list_rowguid_columns INTO @NomeDefault, @NomaTabela
    WHILE @@FETCH_STATUS = 0
    BEGIN
    PRINT 'Apagando o default' +@NomeDefault
    select @CmdSqlDef='Alter Table ' + rtrim(@NomaTabela ) + ' DROP CONSTRAINT '+ rtrim(@NomeDefault )
    print @CmdSqlDef
    EXEC sp_executesql @CmdSqlDef

    PRINT 'Apagando a coluna ROWGUID da tabela  ' +@NomaTabela
    select @CmdSqlCol='Alter Table ' + rtrim(@NomaTabela ) + ' drop column rowguid'
    print @CmdSqlCol
    EXEC sp_executesql @CmdSqlCol

    FETCH NEXT FROM list_rowguid_columns INTO @NomeDefault, @NomaTabela
    END

    CLOSE list_rowguid_columns
    DEALLOCATE list_rowguid_columns

     

     

    • Marcado como Resposta Gabriel Marquez quarta-feira, 11 de março de 2009 18:42
    quarta-feira, 2 de maio de 2007 15:08
  • Rita,

     

    Não tem como, você deverá alterar a sua aplicação principalmente nos colocais a onde existir um Select *.

     

    O SQL Server precisa desta coluna para fazer todo controle de versionamento de registros, bloqueios entre outras situações para que a integridade dos dados replicados seja mantido.

    quarta-feira, 2 de maio de 2007 15:21
  • Bom Dia;

    Estou com o mesmo problema!

    Alguem uma solução que não necessite dropar a coluna rowguid.
    Por que preciso da replicação e também da aplicação!
    Tem alguma alteração no Sql que deva ser alterada, talvez antes de gerar a replicação?

    Desde já, agradeço.
    sábado, 7 de março de 2009 13:32