Usuário com melhor resposta
usuário membership

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
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
-
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
-
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
-
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
-
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
-
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
Álvaro Luiz
- Marcado como Resposta Álvaro Luiz 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.
-
-
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
-
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
-
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
-
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
-
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
-
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
-
-
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
-
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 -
-
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
-
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
-
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
-
-
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
-
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
-
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
-
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
-
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
-
-
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
Álvaro Luiz
- Marcado como Resposta Álvaro Luiz sábado, 24 de agosto de 2013 12:49