Estou trabalhando com o MSSQL Server Management Studio 2008 e preciso expor uma visualização a terceiros para a reconciliação de dados. Eu criei a exibição apropriada, mas estou tendo problemas para criar um usuário e conceder a ele as permissões apropriadas para selecionar na exibição.
Segui os assistentes para criar um login e um usuário e, em seguida, adicionei minha exibição na seção Segurables com a caixa de concessão marcada para selecionar. Tudo parecia bem, mas quando eu entrei como usuário e tentei fazer um "Select * from MyViewName", ele me disse que a permissão de seleção foi negada.
Acabei de recriar o usuário (desta vez usando SQL em vez do assistente) e concedeu explicitamente permissões de seleção e agora está me dando o erro: Msg 916, Level 14, State 1, Line 2
The server principal "username" is not able to access the database "unrelated_db" under the current security context.
(não sei por que ele está tentando acessar o banco de dados não relacionado ...)
Eu realmente não sei para onde ir daqui. Novamente, basicamente tudo o que preciso é criar um usuário que eu possa dar a terceiros para que eles se conectem ao nosso banco de dados e selecione nessa visualização.
fonte
Respostas:
Por favor, não use a interface do usuário para isso. É uma bagunça confusa.
Parece-me que o que você deseja é criar um usuário em um banco de dados, para um login específico, que tenha apenas permissões para selecionar em uma exibição. Então, já que você já criou o login:
EDIT aqui é um exemplo de script que levará ao erro que você mencionou.
Primeiro, crie alguma tabela no unrelated_db:
Agora crie um login relativamente restrito:
Agora crie um banco de dados no qual a visualização permanecerá e adicione o logon como usuário:
Agora crie uma função que fará referência à tabela no outro banco de dados e um sinônimo para a outra tabela:
Agora crie uma tabela local:
Agora crie uma visualização que faça referência à tabela, à função e ao sinônimo e conceda
SELECT
ausername
:Agora tente executar como
username
e selecione apenas a coluna local na exibição:Resultado:
Agora altere a exibição para não fazer referência a objetos externos e execute o acima
SELECT
novamente, e ele funciona:Com exceção de nos mostrar os scripts para os objetos Detalhes do pagamento, Detalhes da conta e MyView, talvez você possa nos informar se essa consulta retorna algum resultado. Você pode encontrar referências a vários objetos através da visualização de catálogo
sys.sql_expression_dependencies
, mas essa visualização não é perfeita - acredito que depende de todas as visualizações serem atualizadas (no caso em que visualizações referenciam outras visualizações, por exemplo, ou o esquema subjacente foi alterado) em ordem Para ser exato.O SQL Server não está apenas tentando acessar
unrelated_db
por diversão ... deve haver algum vínculo com esse banco de dados da exibição que você está tentando usar. Infelizmente, se não conseguimos ver a definição da visualização e mais detalhes sobre os objetos em que ela toca, tudo o que podemos fazer é especular. As duas principais coisas em que consigo pensar são sinônimos ou funções que usam nomes de três partes, mas ver os scripts reais nos dará uma idéia muito melhor do que adivinhar. :-)Você também pode querer verificar
sys.dm_sql_referenced_entities
, no entanto, esta função não retorna nada útil no exemplo acima.fonte
Você pode testar isso fazendo o seguinte:
fonte