データベースに対して次のクエリを実行しています。
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 USER
とEXECUTE AS LOGIN
の両方で結果を返す別のデータベースもあります。
別のユーザーの別のシナリオでは、EXECUTE AS LOGIN = 'domain\username'
を実行しましたが、結果は表示されませんが、EXECUTE AS USER = 'domain\username'
で結果が表示されます。
これらのシナリオの両方のユーザーは、データベースのdb_owner
のメンバーであるログインに関連付けられています。
これらのクエリが期待した結果を返さない理由を誰にも教えてもらえますか?また、重要な情報が不足している場合はお知らせください。ありがとう!
問題は、ログインdomain\username
はデータベースのdboです。alsoは、そのデータベース内の対応するユーザーの名前がdbo
および-であることを意味しますnotdomain\username
。
実行ALTER AUTHORIZATION ON DATABASE::[<yourdb>] TO [sa]
作成したストアドプロシージャでも同じエラーが発生しました。
エラーは、クエリでデータベース名を指定した方法が原因であることがわかりました
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
コマンドを使用できないと思います。