Usuário com melhor resposta
Alterar o database em um Stored Procedure

Pergunta
-
Caros,
estou executando uma Procedure dentro da base Master onde o database é passado por parâmetro, através da variável @DBName, e de acordo com a base é preciso listar os usuários da mesma.
Porem de acordo com o código abaixo, ela está listando os usuários da base Master.
- Já tentei utilizar um USE @DBName, mas não é possível mudar de base dentro de uma Stored Procedure;
- Já tentei utilizar no from do select FROM @DBName.SYS.sysuser, mas também não foi possível;
- Já procurei uma outra tabela do sistema que contivesse todos os usuários e uma coluna database, onde eu pudesse colocar uma clausula WHERE u.database = @DBName, mas também não encontrei.
OBS.: A tabela do sistema com os logins não server.
SELECT @SQL = 'USE ' + @DBName + ';' SELECT @SQL = @SQL + 'EXEC sp_change_users_login ''Update_One'', ''' + U.name + ''', ''' + U.name + ''';' FROM SYS.sysusers U WHERE U.status = 0 AND U.hasdbaccess = 1 AND U.name <> 'dbo' AND U.name NOT LIKE '#%' EXEC (@SQL)
Gostaria de contornar este problema,
Grato.
Igor Auler
Respostas
-
Voce poderia usar uma temporaria global
ficaria mais ou menos assim
SELECT @SQL = 'USE ' + @DBName + ';' SET @SQL = @SQL + 'SELECT U.name into ##Logins FROM SYS.sysusers U WHERE U.status = 0 AND U.hasdbaccess = 1 AND U.name <> ''dbo'' AND U.name NOT LIKE ''#%''' EXEC (@SQL) SELECT @SQL = 'USE ' + @DBName + ';' SELECT 'EXEC sp_change_users_login ''Update_One'', ''' + U.name + ''', ''' + U.name + ''';' FROM ##Logins U DROP TABLE ##Logins
[ ]´s,
Lukas Baldan- Marcado como Resposta Igor Auler segunda-feira, 17 de setembro de 2012 15:31
Todas as Respostas
-
Bom dia Igor !
Realmente voce não pode mudar uma base dentro de uma SP pois ela tem que pertencer a uma base especifica e tambem não da para colocar variavel.tabela, o que acho que pode fazer é concatenar variaveis e executar um select, como abaixo, onde voce passaria somente o @DBName e concatenaria em uma variavel @SQL e depois somente executaria a variavel que retorna o que voce quer, tente aplicar o codigo abaixo:
declare @DBName varchar(50) declare @SQl varchar(800) set @DBName = 'model' set @SQl = 'select * from ' set @SQl = @SQl + @DBName + '.sys.sysusers' Exec (@SQl)
Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.
-
-
Voce poderia usar uma temporaria global
ficaria mais ou menos assim
SELECT @SQL = 'USE ' + @DBName + ';' SET @SQL = @SQL + 'SELECT U.name into ##Logins FROM SYS.sysusers U WHERE U.status = 0 AND U.hasdbaccess = 1 AND U.name <> ''dbo'' AND U.name NOT LIKE ''#%''' EXEC (@SQL) SELECT @SQL = 'USE ' + @DBName + ';' SELECT 'EXEC sp_change_users_login ''Update_One'', ''' + U.name + ''', ''' + U.name + ''';' FROM ##Logins U DROP TABLE ##Logins
[ ]´s,
Lukas Baldan- Marcado como Resposta Igor Auler segunda-feira, 17 de setembro de 2012 15:31
-