2

次の 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」を生成する関数です。

4

3 に答える 3

1

ログインしていないユーザーは、サービス ブローカーのセキュリティ (リモート サービス バインディング) またはコード署名専用に使用される特殊なケースです。それらはなりすましではなくアイデンティティを表します。EXECUTE AS にログインせずにユーザーを使用しないでください。ユーザーからログインへのマッピングが明示的になく、ほとんどすべての場所でマッピングが期待されるため、あらゆる種類のエッジ ケースに遭遇します。

于 2009-10-16T16:24:27.647 に答える
0

ここでの推測ですが、最初の選択は接続と同じように現在ログインしているユーザーとして実行されているように見えます.2番目の選択では、新しく作成されたユーザーとして実行するようにSQLサーバーに指示しています.

于 2009-10-16T16:23:34.937 に答える