none
Migração de Banco de Dados ERP do SQL Server 2005 para 2008 R2 RRS feed

  • Pergunta

  • Bom dia Srs.!

    Estou migrando o banco do meu sistema ERP que atualmente está rodando no SQL Server 2005 para um novo servidor com SQL Server 2008 R2.

    Minha dúvida é:

    Uso o detach e atach ou crio um banco de mesmo nome no novo servidor e faço um restore de um backup full da minha base.

    O restore eu já fiz, porém, o banco traz um login associado as tabelas que eu não consigo tirar. Se eu crio o mesmo login e tento colocar as permissões, ele não aceita.

    Alguém pode me ajudar?

    terça-feira, 6 de março de 2012 12:06

Respostas

  • Saulo,

    Veja esse script com um cursor que pega todas as tabelas do seu database e altera o esquema. Repare que o exec está comentado. É interessante voce rodar antes e observar os Print's antes de descomentar o exec.

    DECLARE cursore CURSOR FOR 
    
    SELECT TABLE_SCHEMA, TABLE_NAME 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_SCHEMA = 'dbo' 
    
    DECLARE @schema sysname, 
     @tab sysname, 
     @sql varchar(500) 
    
    OPEN cursore     
    FETCH NEXT FROM cursore INTO @schema, @tab 
    
    WHILE @@FETCH_STATUS = 0     
    BEGIN 
     SET @sql = 'ALTER SCHEMA senior TRANSFER vetorh.'+ @tab     
     PRINT @sql     
    --exec(@sql)
     FETCH NEXT FROM cursore INTO @schema, @tab     
    END 
    
    CLOSE cursore     
    DEALLOCATE cursore

    At.
    Rafael

    • Marcado como Resposta Saulo Marcos quinta-feira, 8 de março de 2012 18:32
    quinta-feira, 8 de março de 2012 18:02
  • Saulo, segue:

    DECLARE cursore CURSOR FOR 
    
    SELECT s.Name, p.Name FROM sys.Procedures p INNER JOIN 
    sys.Schemas s on p.schema_id = s.schema_id WHERE s.Name = 'vetorh'
    
    DECLARE @schema sysname, 
     @tab sysname, 
     @sql varchar(500) 
    
    OPEN cursore     
    FETCH NEXT FROM cursore INTO @schema, @tab 
    
    WHILE @@FETCH_STATUS = 0     
    BEGIN 
     SET @sql = 'ALTER SCHEMA senior TRANSFER vetorh.'+ @tab     
     PRINT @sql     
    --exec(@sql)
     FETCH NEXT FROM cursore INTO @schema, @tab     
    END 
    
    CLOSE cursore     
    DEALLOCATE cursore

    Observer bem o print antes de mandar executar pra valer...rsrsrsrs

    At.
    Rafael Melo

    • Marcado como Resposta Saulo Marcos sexta-feira, 9 de março de 2012 16:49
    sexta-feira, 9 de março de 2012 14:38

Todas as Respostas

  • Bom dia Saulo,

    A maneira mais rápida (porém deixa o database origem off-line) é o detach/attach. Você pode usar também o "copy database" do SSMS que oferece, com o wizard para voce fazer este procedimento, além de oferecer também a copia do database em modo on-line (que pode demorar um pouco mais).
    Quanto ao seu problema com o login, repare que provavelmente ele é o proprietário de um schema. Para vc conseguir excluir ele, altere o schema pelo qual ele é dono para outro login, assim vc vai conseguir excluir...., e se quiser, adicione-o novamente. Para migração automatizado dos logins, o Integration Services tem um task para esse propósito.

    At.
    Rafael

    terça-feira, 6 de março de 2012 13:57
  • Boa tarde Rafael!

    Obrigado pela resposta! Vou testar o detach/atach, mas antes uma pergunta. Com o atach ele traz toda a estrutura da base com os arquivos mdf e ldf menos os logins certo? Seria mais ou menos o que eu já estou fazendo com o restore?

    Att,

    Saulo

    terça-feira, 6 de março de 2012 19:57
  • Boa tarde Saulo,

    Na verdade, os logins até ele traz, o que não traz são os users, que na veradade estão no banco master. Tem scripts prontos que faz a migração dos usuários também, como também tem a possibilidade de migrar os logins utilizando a task "Transfer Database Users"... acho que é esse o nome. Depois do attach do database vc precisará associar os usuários aos seu respectivos logins, ex:

    EXEC sp_change_users_login 'Update_One', 'rafael', 'rafael'
    
    At.
    Rafael

    terça-feira, 6 de março de 2012 20:12
  • Bom dia Rafael!

    No Sql Server 2005, eu retirei as permissões do banco para o login, fiz o backup full e ao restaurar ele não trouxe nenhum usuário nas permissões. Quando eu criei o mesmo login no 2008 e fui no User Mapping para associar o banco ao login, ele me disse que já havia o mesmo usuário no banco. Rodei a seguinte query para identificar usuários orfãos:

    select u.name from master..syslogins l right join 
        sysusers u on l.sid = u.sid 
        where l.sid is null and issqlrole <> 1 and isapprole <> 1   
        and (u.name <> 'INFORMATION_SCHEMA' and u.name <> 'guest'  
        and u.name <> 'system_function_schema')

    Ele me mostrou os mesmos usuários os quais eu tinha retirado as permissões no 2005 antes de realizar o backup.

    Utilizei a query

    exec sp_revokedbaccess 'usuario'

    para tirar os usuários mas apenas um ele não deixou tirar apenas um usuário dizendo que não era possível  descartar o usuário 'vetorh', pois ele não existe ou você não tem permissão.

    Esta query, eu rodei com o usuário sa. Criei um novo usuário e executei a query que você passou acima porém, quando conecto com este novo usuário e vou executar um select normalmente, ele diz que o nome do objeto é inválido. Se eu executo o select com o usuário antes do nome da tabela (vetorh.R004TMP ), roda normalmente. 

    Preciso eliminar este usuário. Pode me ajudar?

    Obrigado!

    quinta-feira, 8 de março de 2012 12:21
  • Bom dia Saulo,

    Voce nao está conseguindo excluir este usário pq ele é o owner do esquema vetorh. Então em "security"+"schema" do seu database, no schema vetorh troque o owner para outro usuário (poderá ser esse seu novo usuário). Ai voce conseguirá excluir ele.
    Quando ao novo usuário ter a necessidade de informar o schema antes do nome da tabela (vetorh.R004TMP ), é pq ele não faz parte do esquema vetorh. Para que esse usuário faça parte desse esquema, no user mapping altere o Default Schema, que provavelmente deve estar "dbo" para "vetorh".

    At.
    Rafael

    quinta-feira, 8 de março de 2012 13:20
  • Blz Rafael! Entendi o que você quis dizer.

    Alterei o owner do vetorh para senior(meu novo usuário) porém, quando vou deletar o vetorh, ele me diz que não é possível dropar o schema porque o objeto 'acesso_release' faz referencia a ele. Error 3729.

    Parece que eu preciso mudar esta referencia correto? 

    Att,

    Saulo

    quinta-feira, 8 de março de 2012 13:57
  • Rafael, utilizei a seguinte sintaxe para testar:

    ALTER SCHEMA senior TRANSFER vetorh.acesso_release

    e funcionou. Alterou perfeitamente. O problema é que tenho mais de 8000 tabelas no banco.

    Como faria para alterar todas?

    Att,

    Saulo

    quinta-feira, 8 de março de 2012 16:46
  • Saulo,

    Veja esse script com um cursor que pega todas as tabelas do seu database e altera o esquema. Repare que o exec está comentado. É interessante voce rodar antes e observar os Print's antes de descomentar o exec.

    DECLARE cursore CURSOR FOR 
    
    SELECT TABLE_SCHEMA, TABLE_NAME 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_SCHEMA = 'dbo' 
    
    DECLARE @schema sysname, 
     @tab sysname, 
     @sql varchar(500) 
    
    OPEN cursore     
    FETCH NEXT FROM cursore INTO @schema, @tab 
    
    WHILE @@FETCH_STATUS = 0     
    BEGIN 
     SET @sql = 'ALTER SCHEMA senior TRANSFER vetorh.'+ @tab     
     PRINT @sql     
    --exec(@sql)
     FETCH NEXT FROM cursore INTO @schema, @tab     
    END 
    
    CLOSE cursore     
    DEALLOCATE cursore

    At.
    Rafael

    • Marcado como Resposta Saulo Marcos quinta-feira, 8 de março de 2012 18:32
    quinta-feira, 8 de março de 2012 18:02
  • Rafael, perfeito cara!

    Funcionou! Meu problema foi resolvido.

    Muito obrigado!

    Att,

    Saulo

    quinta-feira, 8 de março de 2012 18:37
  • Rafael, uma última pergunta.

    Este script alterou todas as tabelas porém, o usuário vetorh ainda está associado à algumas stored procedures.

    Como altero o código para alterar o schema das stored procedures?

    Obrigado!

    quinta-feira, 8 de março de 2012 18:43
  • Saulo, segue:

    DECLARE cursore CURSOR FOR 
    
    SELECT s.Name, p.Name FROM sys.Procedures p INNER JOIN 
    sys.Schemas s on p.schema_id = s.schema_id WHERE s.Name = 'vetorh'
    
    DECLARE @schema sysname, 
     @tab sysname, 
     @sql varchar(500) 
    
    OPEN cursore     
    FETCH NEXT FROM cursore INTO @schema, @tab 
    
    WHILE @@FETCH_STATUS = 0     
    BEGIN 
     SET @sql = 'ALTER SCHEMA senior TRANSFER vetorh.'+ @tab     
     PRINT @sql     
    --exec(@sql)
     FETCH NEXT FROM cursore INTO @schema, @tab     
    END 
    
    CLOSE cursore     
    DEALLOCATE cursore

    Observer bem o print antes de mandar executar pra valer...rsrsrsrs

    At.
    Rafael Melo

    • Marcado como Resposta Saulo Marcos sexta-feira, 9 de março de 2012 16:49
    sexta-feira, 9 de março de 2012 14:38
  • Rafael, blz cara!

    Mais uma vez funcionou.

    Meu problema está completamente resolvido.

    Muito obrigado mais uma vez!

    Att,

    Saulo

    sexta-feira, 9 de março de 2012 16:31