Eu me deparei com um comportamento muito estranho no SQL Server 2008R2.
Eu tenho um aplicativo de terceiros que atua como um cliente do SQL Server. Eu tenho um subconjunto de meus usuários que devem ter acesso a este aplicativo. Eu criei um grupo do Active Directory, chamo de "DOM \ appusers", com um par de usuários de teste. Eu criei um login do SQL Server com o mesmo nome, criei um banco de dados, chamei-o de "appdb", criei um usuário no banco de dados appdb, "DOM \ appusers" associado ao login e atribui a função "db_owner" a esse usuário .
A maioria das operações funciona. Mas "alguns" deles obtêm erros. Em particular, uma consulta falha:
SELECT x,y,z
INTO tmpTable
FROM (table1 INNER JOIN table 2 on table1.col1 = table2.col1)
INNER JOIN table3 ON table1.col2 = table3.col2
GROUP BY x,y,a,b,c
HAVING (((table2.col4)=0) AND
((table3.col5)=0)) AND
((table3.col6)=0)
Isso foi retirado do SQL Profiler, onde ele sinalizou a consulta com um erro, mas não havia mais detalhes sobre o erro, e o aplicativo não é de ajuda, então não posso dizer exatamente qual erro foi lançado. / p>
Não sou especialista em SQL, por isso não sei o que é especial sobre essa consulta ou por que ela deve exigir permissões além do db_owner, mas isso não é realmente uma dúvida sobre consultas SQL.
O que é realmente estranho para mim é que, se eu ignorar o grupo, obtenho resultados diferentes. Se eu excluir o login e o usuário do SQL Server detalhados acima, crie um novo login e um usuário fazendo referência diretamente a um usuário do Active Directory e atribua-lhe a mesma função db_owner, então a consulta acima funcionará. De fato, todas as consultas funcionam conforme o esperado.
Isso foi estranho o suficiente para que eu achasse que tinha que ser um erro da minha parte. Eu fiz o mesmo experimento três vezes, com o mesmo resultado. Verifiquei que os usuários de teste não têm acesso ao banco de dados sem uma das configurações acima. Tentei atribuir a função "sysadmin" do servidor ao grupo AD e a consulta começou a funcionar. Obviamente, não posso deixar assim, mas foi um ponto de dados. Eu também criei um login usando a autenticação do SQL Server em vez da autenticação do Windows, e isso funcionou também.
A pergunta óbvia é a seguinte: o que há de diferente nas permissões quando um usuário as obtém através de um grupo vs "diretamente" (na medida em que tudo é "direto" com as camadas extras de login e usuário do banco de dados do MSSQL)? O db_owner não significa a mesma coisa para um grupo como para um usuário? Isso é apenas um bug? Existe uma correção? Eu prefiro não ter que adicionar cada usuário do aplicativo à lista de usuários / logon do SQL Server individualmente, mas essa é a única solução que eu já vi até agora. Existe uma solução diferente?
Agradecemos antecipadamente por qualquer ajuda. : -)