最近、EXECUTE AS LOGINを使用して、特定のユーザーがデータベースの1つでテーブル関数を使用できるかどうかを確認しています。テストは彼ができることを示したが、彼は失敗を繰り返し報告した。
人はログイン「WEB」を使用してデータベースに接続し、ログイン「WEB」に関連付けられたデータベースに「WEB」というユーザーがいるため、次のスクリプトを試しました。
-- part 1
EXECUTE AS USER = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
そして
-- part 2
EXECUTE AS LOGIN = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
最初の部分は次の結果で問題ありませんでした:
WEB | WEB | WEB | ウェブ
しかし、2番目の結果は少し混乱しました。
dbo | WEB | WEB | ウェブ
2番目のものを失敗させるEXECUTE AS USERとEXECUTE AS LOGINの違いは何ですか?その上、もちろん、1つ目はデータベースレベルで、2つ目はサーバーレベルのなりすましです。私が認識していることであり、ここでは状況を説明しません。
2つ目は「失敗」ではなく、ログインにサーバーの役割(sysadmin)が割り当てられていることを通知するだけです。ユーザーが要求しているスキーマを確認しましたか?それ以前に、dboのデフォルトスキーマが、開発者が想定していたスキーマではなかった場合。テーブルを完全に参照することにより、コードをより適切に修正
—
Stuart Moore