Usuário com melhor resposta
Migração de Banco de Dados ERP do SQL Server 2005 para 2008 R2

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?
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
-
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
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 -
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
-
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
-
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!
-
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 -
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
-
-
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
-
-
-
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
-