次の T-SQL を検討してください。
CREATE USER my_test_user WITHOUT LOGIN;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
EXECUTE AS USER = 'my_test_user' WITH NO REVERT;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
これらのアカウントWITHOUT LOGIN
を監査目的で使用することを検討しています。基本的に、「データベース接続を取得する」コードは、EXECUTE AS USER...WITH NO REVERT
既に実行されている接続を返します。
問題は、これらのユーザー名関数のいずれからも一貫した結果が得られないことです。出力の 2 行は次のとおりです。
dbo dbo original_user original_user original_user my_test_user my_test_user S-1-9-3-XXXXX.. S-1-9-3-XXXXX.. S-1-9-3-XXXXX..
関数はの後にUSER
正しい出力を生成します'EXECUTE AS'
が、事前にユーザー名ではなく dbo を表示していますSUSER
関数は正反対です-最初は正しいですが、偽装後に何らかの ID を表示しています
SUSER_SNAMEの MSDN ドキュメントには、これが機能するはずの例が明示的に示されています。
更新:私が探しているのは、最初のケースで「original_user」を生成し、2 番目のケースで「my_test_user」を生成する関数です。