none
usuário membership RRS feed

  • Pergunta

  • Uso VS2010 aspnet4 c# sqlserver2008

    Como faço um select para pegar o nome de todos os usuários, o nome do role que ele pertence e o email

    usando o membership, estou fazendo assim mas não traz nada:

    SELECT u.UserName,  r.RoleName,  m.Email, 
    FROM aspnet_Users u, aspnet_Membership m, aspnet_Roles r, aspnet_UsersInRoles i
    WHERE m.UserId = u.UserId AND U.UserId = I.UserId AND R.RoleId = I.RoleId  
    ORDER BY u.UserName


    Álvaro Luiz

    quarta-feira, 21 de agosto de 2013 19:47

Respostas

  • Boa noite,

    Álvaro, acho que a query que você postou retornaria as colunas que você quer se não fosse a vírgula a mais depois da coluna m.Email, mas aproveitando acho que seria melhor utilizar a sintaxe com Join:

    SELECT u.UserName, r.RoleName, m.Email
    FROM aspnet_Users u
    INNER JOIN aspnet_Membership m
        ON m.UserId = u.UserId
    INNER JOIN aspnet_UsersInRoles i
        ON i.UserId = u.UserId
    INNER JOIN aspnet_Roles r
        ON r.RoleId = i.RoleId  
    ORDER BY u.UserName

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Álvaro Luiz quinta-feira, 22 de agosto de 2013 23:57
    quarta-feira, 21 de agosto de 2013 23:23
  • Olá Álvaro,

    Acho estranho você dizer que a coluna UserId está duplicando, pois ela é a PK da tabela.

    Se você executar a consulta abaixo, é retornada alguma linha?

    SELECT UserId, COUNT(*) as QtdLinhas
    FROM aspnet_Users
    group by UserId
    having COUNT(*) > 1

    Acho também que a consulta que sugeri retornaria algumas linhas, mesmo que existam várias linhas com o mesmo UserId. 

    Talvez não tenha retornado nada porque não existe uma linha correspondente para os usuários nas tabelas aspnet_Membership ou aspnet_UsersInRoles. Nesse caso experimente alterar os Inner Joins para Left Joins para ver qual é o resultado:

    SELECT u.UserName, r.RoleName, m.Email
    FROM aspnet_Users u
    LEFT JOIN aspnet_Membership m
        ON m.UserId = u.UserId
    LEFT JOIN aspnet_UsersInRoles i
        ON i.UserId = u.UserId
    LEFT JOIN aspnet_Roles r
        ON r.RoleId = i.RoleId  
    ORDER BY u.UserName

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Álvaro Luiz quinta-feira, 22 de agosto de 2013 23:57
    quinta-feira, 22 de agosto de 2013 12:44
  • Olá Álvaro,

    Acho que você conseguiria obter o resultado dessa forma com a primeira consulta que sugeri, mas se você reparar bem, nesse trecho de resultado que você postou não existe nenhuma linha onde as colunas RoleName e Email sejam diferentes de null.

    Desconfio, pelo resultado que você postou, que cada usuário está sendo inserido duas vezes na tabela aspnet_Users, e que a role está sendo inserida para uma das linhas e o e-mail para a outra.

    Para verificar se isso está mesmo ocorrendo, experimente executar novamente a consulta adicionando a coluna UserId:

    SELECT u.UserId, u.UserName, r.RoleName, m.Email
    FROM aspnet_Users u
    LEFT JOIN aspnet_Membership m
        ON m.UserId = u.UserId
    LEFT JOIN aspnet_UsersInRoles i
        ON i.UserId = u.UserId
    LEFT JOIN aspnet_Roles r
        ON r.RoleId = i.RoleId  
    ORDER BY u.UserName

    obs: verifique a procedure aspnet_Membership_CreateUser para inserir os usuários 

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Álvaro Luiz quinta-feira, 22 de agosto de 2013 23:57
    quinta-feira, 22 de agosto de 2013 13:57
  • Acredito que não seja normal a inserção de 2 linhas na tabela aspnet_Users para cada usuário.

    Experimente fazer um teste executando a procedure aspnet_Membership_CreateUser através do SQL Sever Management Studio (adaptando o nome da sua aplicação) para ver como ficam as tabelas depois:

    DECLARE @UserId uniqueidentifier
    
    EXECUTE [aspnetdb].[dbo].[aspnet_Membership_CreateUser] 
       N'NomeAplicacao'
      ,N'UsuarioTeste'
      ,N'senha'
      ,N'senha'
      ,N'usuarioteste@live.com'
      ,N'Pergunta / senha'
      ,N'Resposta / senha'
      ,1
      ,'2013-08-22'
      ,'2013-08-22'
      ,0
      ,0
      ,@UserId OUTPUT
    
    SELECT @UserId
    
    GO
    
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Álvaro Luiz quinta-feira, 22 de agosto de 2013 23:57
    quinta-feira, 22 de agosto de 2013 18:22
  • Olá Álvaro,

    Experimente dessa forma:

    set dateformat dmy;
    
    DECLARE @UserId uniqueidentifier
    
    EXECUTE [aspnetdb].[dbo].[aspnet_Membership_CreateUser] 
       N'NomeAplicacao'
      ,N'UsuarioTeste'
      ,N'senha'
      ,N'senha'
      ,N'usuarioteste@live.com'
      ,N'Pergunta / senha'
      ,N'Resposta / senha'
      ,1
      ,'22-08-2013'
      ,'22-08-2013'
      ,0
      ,0
      ,@UserId OUTPUT
    
    SELECT @UserId
    
    EXECUTE [aspnetdb].[dbo].[aspnet_UsersInRoles_AddUsersToRoles] 
       N'NomeAplicacao'
      ,N'UsuarioTeste'
      ,N'NomeRole'
      ,'22-08-2013'
      
    GO
    

    Vai ser necessário adaptar também o RoleName que tinha faltado no script anterior.

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Alysson Queiroz quinta-feira, 22 de agosto de 2013 20:26
    quinta-feira, 22 de agosto de 2013 18:43
  • Olá Gapimex, e todos que ajudaram, a resposta está no post abaixo e por incrível que pareça o problema está no webconfig

    A resposta encontrei num post de Guru SarKar´s

    http://weblogs.asp.net/gurusarkar/archive/2010/01/09/asp-net-mebership-creates-two-users-in-aspnet-users-table.aspx


    Álvaro Luiz

    • Marcado como Resposta Álvaro Luiz sábado, 24 de agosto de 2013 12:49
    sábado, 24 de agosto de 2013 12:49

Todas as Respostas

  • Alvaro, veja se esta query te ajuda listando o usuario, base e roles sendo 1 se pertence ou 0 caso negativo:

    use master
    go
    select 
    	loginname,
    	dbname,
    	hasaccess,
    	sysadmin,
    	securityadmin,
    	serveradmin,
    	setupadmin,
    	processadmin,
    	diskadmin,
    	dbcreator,
    	bulkadmin 
    	from sys.syslogins


    Alexandre Matayosi Conde Mauricio.

    quarta-feira, 21 de agosto de 2013 20:02
  • Olá Alexandre,

    Estou usando o banco  criado com o comando

    aspnet_regsql.exe

    que trabalha com segurança no asp.net onde voce configura o membership do aspnet

    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

     “aspnet_regsql”.


    Álvaro Luiz

    quarta-feira, 21 de agosto de 2013 22:13
  • Boa noite,

    Álvaro, acho que a query que você postou retornaria as colunas que você quer se não fosse a vírgula a mais depois da coluna m.Email, mas aproveitando acho que seria melhor utilizar a sintaxe com Join:

    SELECT u.UserName, r.RoleName, m.Email
    FROM aspnet_Users u
    INNER JOIN aspnet_Membership m
        ON m.UserId = u.UserId
    INNER JOIN aspnet_UsersInRoles i
        ON i.UserId = u.UserId
    INNER JOIN aspnet_Roles r
        ON r.RoleId = i.RoleId  
    ORDER BY u.UserName

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Álvaro Luiz quinta-feira, 22 de agosto de 2013 23:57
    quarta-feira, 21 de agosto de 2013 23:23
  • Olá Amigo,

    Sua consulta não deu erro mas também não trouxe nada, o problema é que a tabela User sempre que é adicionado um usuário ela duplica o userID.

    Mesmo assim muito obrigado.

    Essa consulta só sabe fazer quem conhece o banco gerado pelo comando aspnet_regsql.exe pois a tabela aspnet_User duplica o código userID, esse é o grande gargalo da consulta.


    Álvaro Luiz


    • Editado Álvaro Luiz quinta-feira, 22 de agosto de 2013 11:15
    quinta-feira, 22 de agosto de 2013 00:45
  • Olá Álvaro,

    Acho estranho você dizer que a coluna UserId está duplicando, pois ela é a PK da tabela.

    Se você executar a consulta abaixo, é retornada alguma linha?

    SELECT UserId, COUNT(*) as QtdLinhas
    FROM aspnet_Users
    group by UserId
    having COUNT(*) > 1

    Acho também que a consulta que sugeri retornaria algumas linhas, mesmo que existam várias linhas com o mesmo UserId. 

    Talvez não tenha retornado nada porque não existe uma linha correspondente para os usuários nas tabelas aspnet_Membership ou aspnet_UsersInRoles. Nesse caso experimente alterar os Inner Joins para Left Joins para ver qual é o resultado:

    SELECT u.UserName, r.RoleName, m.Email
    FROM aspnet_Users u
    LEFT JOIN aspnet_Membership m
        ON m.UserId = u.UserId
    LEFT JOIN aspnet_UsersInRoles i
        ON i.UserId = u.UserId
    LEFT JOIN aspnet_Roles r
        ON r.RoleId = i.RoleId  
    ORDER BY u.UserName

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Álvaro Luiz quinta-feira, 22 de agosto de 2013 23:57
    quinta-feira, 22 de agosto de 2013 12:44
  • olá Gapimex

    Dessa vez a consulta funcionou veja a imagem abaixo,

     

    Como faço para trazer apenas as linhas cuja coluna RoleName seja diferente de NULL, e  Email diferente de null, gotaria que trouxesse o nome, role e o email deles é possível, pra exibir em um grid


    Álvaro Luiz



    • Editado Álvaro Luiz quinta-feira, 22 de agosto de 2013 13:28
    quinta-feira, 22 de agosto de 2013 13:25
  • Olá Álvaro,

    Acho que você conseguiria obter o resultado dessa forma com a primeira consulta que sugeri, mas se você reparar bem, nesse trecho de resultado que você postou não existe nenhuma linha onde as colunas RoleName e Email sejam diferentes de null.

    Desconfio, pelo resultado que você postou, que cada usuário está sendo inserido duas vezes na tabela aspnet_Users, e que a role está sendo inserida para uma das linhas e o e-mail para a outra.

    Para verificar se isso está mesmo ocorrendo, experimente executar novamente a consulta adicionando a coluna UserId:

    SELECT u.UserId, u.UserName, r.RoleName, m.Email
    FROM aspnet_Users u
    LEFT JOIN aspnet_Membership m
        ON m.UserId = u.UserId
    LEFT JOIN aspnet_UsersInRoles i
        ON i.UserId = u.UserId
    LEFT JOIN aspnet_Roles r
        ON r.RoleId = i.RoleId  
    ORDER BY u.UserName

    obs: verifique a procedure aspnet_Membership_CreateUser para inserir os usuários 

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Álvaro Luiz quinta-feira, 22 de agosto de 2013 23:57
    quinta-feira, 22 de agosto de 2013 13:57
  • Olá Gapimex

    o novo select retornou o que mostra a imagem a baixo:

    o procedimento para inserir um novo usuário é o abaixo

    MembershipUser novoUsuario = Membership.CreateUser(login, senha, email, pergunta, resposta, true, out status);

    percebe-se que de forma automática ele cria 2 UserId  na tabela USER quando se inseri um usuário:

    o que eu preciso é um select que traga esse campos marcados:



    Álvaro Luiz


    • Editado Álvaro Luiz quinta-feira, 22 de agosto de 2013 17:13
    quinta-feira, 22 de agosto de 2013 17:12
  • Pra melhor entendimento, vou postar uma imagem das 4 tabelas com seus respectivos conteúdos:


    Álvaro Luiz

    quinta-feira, 22 de agosto de 2013 17:19
  • Acredito que não seja normal a inserção de 2 linhas na tabela aspnet_Users para cada usuário.

    Experimente fazer um teste executando a procedure aspnet_Membership_CreateUser através do SQL Sever Management Studio (adaptando o nome da sua aplicação) para ver como ficam as tabelas depois:

    DECLARE @UserId uniqueidentifier
    
    EXECUTE [aspnetdb].[dbo].[aspnet_Membership_CreateUser] 
       N'NomeAplicacao'
      ,N'UsuarioTeste'
      ,N'senha'
      ,N'senha'
      ,N'usuarioteste@live.com'
      ,N'Pergunta / senha'
      ,N'Resposta / senha'
      ,1
      ,'2013-08-22'
      ,'2013-08-22'
      ,0
      ,0
      ,@UserId OUTPUT
    
    SELECT @UserId
    
    GO
    
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Álvaro Luiz quinta-feira, 22 de agosto de 2013 23:57
    quinta-feira, 22 de agosto de 2013 18:22
  • Mas esses dados, a idéia é levar para uma aplicação em .NET ?

    Se for, já existem classes que retornam todas essas informações, sem ter a necessidade de montar uma Query...


    Leonardo Lourenço Silva
    MCT, MCSD, MCPD, MCTS, MCP, MTA
    netcoders.com.br
    leolosi.wordpress.com

    quinta-feira, 22 de agosto de 2013 18:26
  • Ola Gapimex 

    o insert retorna um erro:

    Mensagem 8114, Nível 16, Estado 5, Procedimento aspnet_Membership_CreateUser, Linha 0
    Erro ao converter tipo de dados varchar em datetime.


    Álvaro Luiz

    quinta-feira, 22 de agosto de 2013 18:30
  • Olá Álvaro,

    Experimente dessa forma:

    set dateformat dmy;
    
    DECLARE @UserId uniqueidentifier
    
    EXECUTE [aspnetdb].[dbo].[aspnet_Membership_CreateUser] 
       N'NomeAplicacao'
      ,N'UsuarioTeste'
      ,N'senha'
      ,N'senha'
      ,N'usuarioteste@live.com'
      ,N'Pergunta / senha'
      ,N'Resposta / senha'
      ,1
      ,'22-08-2013'
      ,'22-08-2013'
      ,0
      ,0
      ,@UserId OUTPUT
    
    SELECT @UserId
    
    EXECUTE [aspnetdb].[dbo].[aspnet_UsersInRoles_AddUsersToRoles] 
       N'NomeAplicacao'
      ,N'UsuarioTeste'
      ,N'NomeRole'
      ,'22-08-2013'
      
    GO
    

    Vai ser necessário adaptar também o RoleName que tinha faltado no script anterior.

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Alysson Queiroz quinta-feira, 22 de agosto de 2013 20:26
    quinta-feira, 22 de agosto de 2013 18:43
  • Amigo voce tem razão, eu inseri um usuário pelo VisualStudio clicando em Configuração do Asp.Net e ele criou apenas um User, deve ter algo errado na aplicação quando mando criar um usuário pois ele está duplicando no userId. Mas muito obrigado, descobri o erro graças a voce, vou marcar todas suas respostas como respondida quando descobri o problema posto aqui.

     

    Álvaro Luiz

    quinta-feira, 22 de agosto de 2013 18:49
  • Olá Gapimex, acho que tenho uma explicação pra a tabela User criar 2 registro do mesmo usuário,  eu faço o código abaixo:


     MembershipUser novoUsuario = Membership.CreateUser(login, senha, email, pergunta, resposta, true, out status);
                        if (novoUsuario != null)
                        {                                          
                            Roles.AddUserToRole(login, ddFuncao.SelectedValue);  

                } 

    Adiciono um usuário e depois adiciono ao usuário criado uma role, é ai que ele cria na tabela User outro registro do mesmo usuário dessa vez referenciando a role.

    Isso é correto mesmo?


    Álvaro Luiz

    quinta-feira, 22 de agosto de 2013 23:55
  • Olá LGROUP

    minha intenção é montar um grid com nome do usuário, seu email e a sua role


    Álvaro Luiz

    sexta-feira, 23 de agosto de 2013 00:01
  • Não conheço essas classes e métodos muito bem, mas não acredito que o método AddUserToRole esteja provocando esse problema. 

    Para tirar a dúvida você poderia comentar a linha onde esse método é executado para ver se o problema persiste:

                           // Roles.AddUserToRole(login, ddFuncao.SelectedValue);  

    Desconfio que o problema está em outra parte do código, pois não estão sendo inseridas 2 linhas para cada usuário na tabela aspnet_Membership.


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 23 de agosto de 2013 00:46
  • Olá Gapimex,

    Testando muito descobri o seguinte: Quando voce cria um usuário ele adiciona uma registro na tabela User e quando voce adiciona um Role a este usuário, a classe membership cria outro registro na tabela User com o mesmo usuário, isso parece ser um processo nativo da classe membership,  pois testei criar registro pela própria ferramenta de Configuração do Asp.Net do VS2010, e ele fez exatamente isso, se eu crio apenas o usuário ele adiciona um registro na tabela User, se adiciono um Role ele cria outro registro do mesmo usuário. No início achei estranho, mas como o próprio gerenciador do VS2010 faz isso, fazer o que né, vou aceitar.

    Só me resta uma dúvida: Como monto um select pra exibir no grid com: nome, email e role.   


    Álvaro Luiz

    sexta-feira, 23 de agosto de 2013 11:25
  • Olá Álvaro,

    Fiz um teste com um código semelhante ao seu para executar os métodos Membership.CreateUser e Roles.AddUserToRole e foi adicionada somente uma linha para o usuário na tabela aspnet_Users.

    Acho que o que você relatou não é comum e não deveria ocorrer.


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 23 de agosto de 2013 14:58
  • Olá Gapimex

    Então meu VS2010 está doido rsrsrrs, eu fiz assim: abri o VS2010 configurei a segurança e criei roles para minha aplicação, isso na própria ferramente (lá no gerenciador de soluções tem um ícone onde é um martelo e o globo veja a imagem)

    Lá mesmo eu criei um usuário e marquei que ele pertenceria a uma role que criei anteriormente e depois fui no banco e lá estava, duas linhas na tabela User, agora se eu criar o usuário e não definir nenhuma role pra ele, ai sim ele cria apenas uma registro na tabela User.

    Se isso for errado meu VS2010 tá bug.


    Álvaro Luiz

    sexta-feira, 23 de agosto de 2013 17:09
  • Olá,

    Continuo achando que tem alguma coisa errada.

    Se for possível, talvez seja melhor você criar esse banco novamente para fazer novos testes.


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 23 de agosto de 2013 19:00
  • Tudo bem , vou criar novamente o banco e depois posto aqui

    até logo!


    Álvaro Luiz

    sexta-feira, 23 de agosto de 2013 19:51
  • Olá Gapimex, e todos que ajudaram, a resposta está no post abaixo e por incrível que pareça o problema está no webconfig

    A resposta encontrei num post de Guru SarKar´s

    http://weblogs.asp.net/gurusarkar/archive/2010/01/09/asp-net-mebership-creates-two-users-in-aspnet-users-table.aspx


    Álvaro Luiz

    • Marcado como Resposta Álvaro Luiz sábado, 24 de agosto de 2013 12:49
    sábado, 24 de agosto de 2013 12:49