none
Alterar o database em um Stored Procedure RRS feed

  • 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

    segunda-feira, 17 de setembro de 2012 14:39

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
    segunda-feira, 17 de setembro de 2012 14:58

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.

    segunda-feira, 17 de setembro de 2012 14:51
  • utilizei o sql 2008 R2 no exemplo acima e funcionou...

    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.

    segunda-feira, 17 de setembro de 2012 14:53
  • 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
    segunda-feira, 17 de setembro de 2012 14:58
  • Vlw Lukas, funcionou aqui.

    Obrigado também pela ajuda Alexandre, mas optei utilizar a tabela temporária global.


    Igor Auler

    segunda-feira, 17 de setembro de 2012 15:32