Je travaille avec MSSQL Server Management Studio 2008 et j'ai besoin d'exposer une vue à un tiers pour leur réconciliation des données. J'ai créé la vue appropriée, mais j'ai du mal à créer un utilisateur et à lui accorder les autorisations appropriées pour effectuer une sélection dans la vue.
J'ai suivi les assistants pour créer une connexion et un utilisateur, puis j'ai ajouté ma vue dans la section Securables avec la case d'autorisation cochée pour sélectionner. Tout semblait bien mais quand je me suis connecté en tant qu'utilisateur et que j'ai essayé de faire un "Select * from MyViewName", il m'a dit que l'autorisation de sélection avait été refusée.
Je viens de recréer l'utilisateur (cette fois en utilisant simplement SQL au lieu de l'assistant) et 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.
j'ai explicitement accordé des autorisations de sélection et maintenant cela me donne l'erreur: (je ne sais pas pourquoi il essaie d'accéder à la base de données non liée ...)
Je ne sais vraiment pas où aller d'ici. Encore une fois, tout ce dont j'ai besoin est de créer un utilisateur que je peux donner au tiers pour qu'il se connecte à notre base de données et sélectionne dans cette vue.
la source
Réponses:
Veuillez ne pas utiliser l'interface utilisateur pour cela. C'est un désordre déroutant.
Il me semble que ce que vous voulez, c'est créer un utilisateur dans une base de données, pour une connexion spécifique, qui n'a que les autorisations pour sélectionner dans une vue. Donc, puisque vous avez déjà créé la connexion:
MODIFIER ici est un exemple de script qui conduira à l'erreur que vous mentionnez.
Tout d'abord, créez une table dans le unrelated_db:
Créez maintenant une connexion relativement restreinte:
Créez maintenant une base de données où la vue va vivre et ajoutez la connexion en tant qu'utilisateur:
Créez maintenant une fonction qui référencera la table dans l'autre base de données et un synonyme de l'autre table:
Créez maintenant une table locale:
Créez maintenant une vue qui référence la table, la fonction et le synonyme, et accordez
SELECT
àusername
:Essayez maintenant d'exécuter en tant que
username
et sélectionnez uniquement la colonne locale dans la vue:Résultat:
Maintenant, changez la vue pour ne référencer aucun objet externe et exécutez à
SELECT
nouveau ce qui précède , et cela fonctionne:À moins de nous montrer les scripts des objets Détails du paiement, Détails du compte et MyView, vous pouvez peut-être nous faire savoir si cette requête renvoie des résultats. Vous pouvez trouver des références à divers objets via la vue du catalogue
sys.sql_expression_dependencies
, mais cette vue n'est pas parfaite - je crois qu'elle dépend de toutes les vues actualisées (dans le cas où les vues font référence à d'autres vues, par exemple, ou le schéma sous-jacent a changé) afin pour être précis.SQL Server ne va pas simplement essayer d'accéder
unrelated_db
pour le plaisir ... il doit y avoir un lien avec cette base de données à partir de la vue que vous essayez d'utiliser. Malheureusement, si nous ne pouvons pas voir la définition de la vue et plus de détails sur les objets qu'elle touche, tout ce que nous pouvons faire est de spéculer. Les deux principales choses auxquelles je peux penser sont des synonymes ou des fonctions qui utilisent des noms en trois parties, mais voir les scripts réels nous donnera une bien meilleure idée au lieu de deviner. :-)Vous pouvez également vérifier
sys.dm_sql_referenced_entities
, mais cette fonction ne renvoie rien d'utile dans l'exemple ci-dessus.la source
Vous pouvez tester cela en procédant comme suit:
la source