web-dev-qa-db-ja.com

EXECUTE AS USER / LOGINが期待される結果を返さない理由に関する明確化

データベースに対して次のクエリを実行しています。

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

ただし、次のエラーがスローされます。

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.

ユーザーはデータベースのdboであり、Management Studioでプロパティを開くと、そのログインに関連付けられていることがわかります。一方、EXECUTE AS LOGIN = 'domain\username'を実行すると結果が返されます。 EXECUTE AS USER = 'dbo'を明示的に実行すると、結果が得られます。この同じシナリオがEXECUTE AS USEREXECUTE AS LOGINの両方で結果を返す別のデータベースもあります。

別のユーザーの別のシナリオでは、EXECUTE AS LOGIN = 'domain\username'を実行しましたが、結果は表示されませんが、EXECUTE AS USER = 'domain\username'で結果が表示されます。

これらのシナリオの両方のユーザーは、データベースのdb_ownerのメンバーであるログインに関連付けられています。

これらのクエリが期待した結果を返さない理由を誰にも教えてもらえますか?また、重要な情報が不足している場合はお知らせください。ありがとう!

14
athom

問題は、ログインdomain\usernameはデータベースのdboです。alsoは、そのデータベース内の対応するユーザーの名前がdboおよび-であることを意味しますnotdomain\username

11
RBarryYoung

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

1
Remus Rusanu

作成したストアドプロシージャでも同じエラーが発生しました。

エラーは、クエリでデータベース名を指定した方法が原因であることがわかりました

SELECT emp_no 
FROM   db_name.employee 
WHERE  emp_no = 1234

スクリプトからデータベース名を削除すると、db_name2でプロシージャを実行していました

SELECT emp_no 
FROM   employee 
WHERE  emp_no = 1234

うまくいきました。

ログのアクセス権が制限されているため、他のデータベースやuse db_nameコマンドを使用できないと思います。

0
Jim Miller