web-dev-qa-db-fra.com

Clarification des raisons pour lesquelles EXECUTE AS USER / LOGIN ne renvoie pas les résultats attendus?

J'exécute la requête suivante sur une base de données:

execute as user = 'domain\username'
select * from fn_my_permissions(null, 'DATABASE')
order by subentity_name, permission_name
revert;

Mais l'erreur suivante est levée:

Cannot execute as the database principal because the principal "dev\spadmin" does not exist, this type of principal cannot be impersonated, or you do not have permission.

L'utilisateur est le dbo de la base de données, et lorsque j'ouvre les propriétés dans le studio de gestion, je peux voir qu'il est associé à cette connexion. Fonctionnement EXECUTE AS LOGIN = 'domain\username' renvoie en revanche des résultats. Et si je lance explicitement EXECUTE AS USER = 'dbo', J'obtiens des résultats. J'ai également une base de données différente où ce même scénario renvoie des résultats avec les deux EXECUTE AS USER et EXECUTE AS LOGIN.

Dans un autre scénario avec un autre utilisateur, j'ai exécuté EXECUTE AS LOGIN = 'domain\username' et je n'obtiens pas de résultats, mais j'obtiens des résultats avec EXECUTE AS USER = 'domain\username'.

Dans ces scénarios, les deux utilisateurs sont associés à des connexions membres de db_owner pour la base de données.

Quelqu'un peut-il me dire pourquoi ces requêtes ne renvoient pas les résultats que j'attends? Et faites-moi savoir si je manque des informations importantes. Merci!

14
athom

Le problème est dû au fait que la connexion domain\username est le dbo de la base de données, cela également signifie que le nom de l'utilisateur correspondant dans cette base de données est dbo et - pas domain\username.

11
RBarryYoung

courir ALTER AUTHORIZATION ON DATABASE::[<yourdb>] TO [sa]

1
Remus Rusanu

J'ai eu la même erreur pour une procédure stockée que j'ai écrite.

J'ai trouvé que l'erreur était due à la façon dont j'avais spécifié le nom de la base de données dans la requête

SELECT emp_no 
FROM   db_name.employee 
WHERE  emp_no = 1234

J'exécutais la procédure le db_name2 une fois que j'ai supprimé le nom de la base de données de mon script

SELECT emp_no 
FROM   employee 
WHERE  emp_no = 1234

cela a bien fonctionné.

Je ne pense pas que les droits d'accès réduits du journal permettent l'utilisation d'autres bases de données ou le use db_name commande.

0
Jim Miller