ユーザー名とユーザー ID を返す関数

いくつかのシステム関数ではユーザー名とユーザー ID が返されます。SQL Server で使用される名前の種類や ID を理解することは、これらの関数のパラメータと出力を理解するうえで重要です。

SQL Server にログオンする各ユーザーには、次の 2 つのレベルの SQL Server の名前があります。また、各名前には、一意の ID が関連付けられます。

  • ログイン名

    SQL Server へのログオンを認証されている各ユーザーには、SQL Server のインスタンスへのユーザー アクセスを可能にするログイン名が 1 つあります。ログイン名には次の 2 種類があります。

    • Microsoft Windows のアカウント名

      sysadmin または securityadmin 固定サーバー ロールのメンバは、sp_grantlogin を使用することにより、個別のユーザーの Windows アカウントまたは Windows グループから SQL Server のインスタンスにログオンすることを承認できます。Windows アカウントで識別されたユーザー、または Windows グループのユーザーは、Windows 認証を使用して SQL Server のインスタンスに接続できます。各 Windows アカウント名またはグループ名は、sys.server_principals に格納されます。Windows アカウントまたはグループの Windows セキュリティ ID は、sys.server_principals.sid に格納されます。

    • SQL Server ログイン名

      SQL Server 認証を使用してユーザーがログオンするときに、このログイン名が使用されます。sysadmin または securityadmin 固定サーバー ロールのメンバは、sp_addlogin を使用することにより、SQL Server ログイン名を定義します。各 SQL Server ログイン名は、master.dbo.syslogins.loginname に格納されます。SQL Server は、セキュリティ ID として使用される GUID を生成し、sys.server_principals.sid に格納します。

      SQL Server では、ログイン名の security_identifier として、sys.server_principals.sid が使用されます。

  • データベース ユーザー名

    各 Windows アカウントまたは SQL Server ログインを、ユーザーからのアクセスが認証されている各データベースのユーザー名と関連付けるか、データベースへの guest アクセスを有効にする必要があります。データベース ユーザー名は、db_owner または db_accessadmin 固定データベース ロールのメンバによって定義され、各データベースにある sys.database_principals テーブルに格納されます。各データベース ユーザー名は、sys.database_principals.uid に格納されているデータベース ユーザー ID に関連付けられます。

    各ユーザーの security identifier は、sys.database_principals.sid に格納されます。したがって、関連付けられたログインからユーザーを特定できます。SQL Server ログインまたは Windows アカウントで使用するのと同じ名前をデータベース ユーザー名に使うと混乱が少なくて済みますが、必ずしも同じ名前にする必要はありません。

ログイン アカウントまたは ID の取得

SQL Server のインスタンスに接続するときに、次の関数を使用してログイン アカウントまたは ID を取得できます。

  • SUSER_SNAME。security identifier に関連付けられた、SQL Server ログイン名または Windows アカウントを取得します。

  • SUSER_SID。SQL Server ログイン名または Windows アカウントに関連付けられた、security identifier を取得します。

  • SUSER_SID() (login_account パラメータを指定しない SUSER_SID)。SQL Server 認証または Windows 認証のいずれが使用されていても、現在の接続の security identifier を取得します。

  • ISO 関数の SYSTEM_USER。Windows 認証接続の Windows アカウント、または SQL Server 認証接続の SQL Server ログイン名を取得します。Transact-SQL では、SYSTEM_USER が SUSER_SNAME() のシノニムとして実装されています (security_identifier パラメータを指定しない SUSER_SNAME)。

SQL Server では、ログイン名またはアカウントを返す関数は、次のように操作します。

  • SUSER_SNAME(security_identifier)

    SUSER_SNAME では、以下のどちらも取得します。

    • Windows アカウントまたはグループの security_identifier。この場合、Windows アカウントまたはグループの名前を返します。

    • SQL Server ログイン用に生成された擬似 security_identifier。この場合、SQL Server ログイン名を返します。

    Windows 認証を使用した接続で、security_identifier が指定されていない場合、SUSER_SNAME は接続に関連付けられた Windows アカウントの名前を返します。SQL Server 認証を使用して接続された場合、SUSER_SNAME は接続に関連付けられた SQL Server ログインを返します。

  • SYSTEM_USER

    ISO では、関数が SUSER_SNAME() のシノニムとして実装されています (security_identifier パラメータを指定しない SUSER_SNAME)。

データベース ユーザー名またはユーザー ID の取得

SQL Server のインスタンスに接続しているときは、次の関数を使用してユーザー名またはユーザー ID を取得できます。

  • USER_ID。データベース ユーザー名に関連付けられたデータベース ユーザー ID を取得します。

  • USER_ID()。現在の接続に関連付けられたデータベース ユーザー ID を取得します。

  • USER_NAME。データベース ユーザー ID に関連付けられたデータベース ユーザー名を取得します。

  • ISO の CURRENT_USER 関数または SESSION_USER 関数。現在の接続に関連付けられたデータベース ユーザー名を取得します。Transact-SQL では、これらの関数は USER_NAME() のシノニムとして実装されています (database_user_ID パラメータを指定しない USER_NAME)。Transact-SQL 関数の USER も、USER_NAME() のシノニムとして実装されています。

    ISO を使用すると、SQL のステートメントを SQL のデータベースに接続しているユーザーの承認 ID とは別の承認 ID を持つ SQL モジュールでエンコードできます。ISO は、SESSION_USER が接続を確立しているユーザーの承認 ID を返すよう指定します。CURRENT_USER は、SQL モジュールから実行されたステートメントに SQL モジュールの承認 ID を返します。また、ステートメントが SQL モジュールによって実行されていない場合、接続を確立したユーザーの承認 ID を返します。SQL モジュールが別の認証 ID を持っていない場合、ISO は CURRENT_USER が SESSION_USER と同じ値を返すよう指定します。SQL Server では SQL モジュールが別の認証 ID を持たないため、CURRENT_USER と SESSION_USER が返す値は常に同じです。ISO では、USER 関数は標準的な SQL Server の旧バージョンのアプリケーションとの互換性を維持するための関数として定義されています。この関数は CURRENT_USER と同じ値を返すように指定されています。

SQL Server では、ログイン名またはアカウントを返す関数は、次のように操作します。

  • USER_ID('database_user_name')

    USER_ID は指定されたデータベース ユーザー名に関連付けられたデータベース ユーザー ID を返します。database_user_name が指定されていない場合、USER_ID は現在の接続に関連付けられたデータベース ユーザー ID を返します。

  • USER_NAME(database_user_ID)

    USER_NAME は、指定されたデータベース ユーザー ID に関連付けられたデータベース ユーザー名を返します。database_user_ID が指定されていない場合、USER_NAME は現在の接続に関連付けられたデータベース ユーザー名を返します。

  • CURRENT_USER、SESSION_USER、USER

    これらの関数は USER_NAME() のシノニムです (database_user_ID パラメータを使用せずに指定される USER NAME)。