Executando o mesmo script em vários bancos utilizando “sp_msforeachdb”
Hoje tive mais um desafio a ser ultrapassado.
Trabalho em um projeto modelo SaaS aonde cada cliente tem seu próprio banco de dados. Estamos alterando um módulo que gera impacto no banco de dados e precisamos replicar o script para todos os clentes (cada cliente tem um banco de dados SQL separado).
A primeira idéia foi pegar todas as strings de conexão e montar um console que fizesse o trabalho. Pesquisando outras soluções, encontramos “sp_msforeachdb“. Ela serve exatamente para o que preciso.
No meu caso, estou mudando o módulo de Login da aplicação e preciso buscar todos os usuários para inserí-los no novo módulo.
Segue o script:
create table #Administradores( [IdAdministrador] [int] , [IdParceiro] [int] , [Nome] [varchar](50) , [Email] [varchar](250) , [Login] [varchar](50) , [Senha] [varchar](50) , [FlagAtiva] [bit] , [IdLojaFisica] [int], [dbName] [varchar](100) ) EXECUTE sp_msforeachdb 'USE ? ; IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE="BASE TABLE" AND TABLE_NAME="Administrador") insert into tempdb.#Administradores SELECT [IdAdministrador] ,[IdParceiro] ,[Nome] ,[Email] ,[Login] ,[Senha] ,[FlagAtiva] ,[IdLojaFisica] ,DB_NAME() FROM [Administrador]' select * from #Administradores drop table #Administradores
Esse script já retorna uma única tabela com todos os usuários, como se fosse uma tabela única. Basta criar uma procedure com o script acima e fazer o console utilizar a procedure.
Alguns links que ajudaram:
- http://weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
- http://edvaldocastro.wordpress.com/2011/06/17/sp_msforeachdb/
Garoto, você é demais. Show!!! Como sempre digo, isso é uma solução dos DIABOS!