ログイン・データベースユーザーの確認 | The server principal “xxxxxxxxxx” is not able to access the database “xxxxxxxxxx” under the current security context.

IT

はじめに

先日SQL Serverに接続を試みた際に、下記エラーが発生しました。

The server principal “xxxxxxxxxx” is not able to access the database “xxxxxxxxxx” under the current security context.

本エラーはあるユーザーがデータベースに接続が出来ていないというわけですが、多くの場合ログインが作成されていなかったり、データベースユーザーがログインと上手く紐づいていない可能性があります。

SQL Server(Azure SQL Database,Azure Synapse Analytics)に接続するにはログイン、及びログインに紐づけられたデータベースユーザーが必要です。

ログインは、セキュリティ プリンシパル、またはセキュリティで保護されたシステムで認証できるエンティティです。 ユーザーが SQL Server に接続するにはログインが必要です。 Windows プリンシパル (ドメイン ユーザーや Windows ドメイン グループなど) に基づいてログインを作成することも、Windows プリンシパル (SQL Server ログインなど) に基づいていないログインを作成することもできます。

参考:ログインの作成 – SQL Server | Microsoft Docs

そこで本記事ではログイン・データベースユーザーの詳細情報の確認方法を解説していきます。

確認方法

結論から言うと、下記クエリでログイン・データベースユーザーの確認が可能です。

ログイン

select * from sys.sql_logins

参考:sys.sql_logins (Transact-SQL) – SQL Server | Microsoft Docs

データベースユーザー

select * from sys.database_principals

参考:sys.server_principals (Transact-SQL) – SQL Server | Microsoft Docs

詳細手順

1.SQL Server Management Studio (SSMS)にてサーバーにログイン

まずはじめに以下に従い、SSMSからSQL Serverに接続へを実施します。

参考: SQL Server Management Studio (SSMS) を使用して SQL Server インスタンスに接続し、クエリを行う – SQL Server Management Studio (SSMS) | Microsoft Docs

2.「master」を右クリックし、[New Query]を選択。下記クエリを実行。

ログインはmasterデータベースに作成するため、masterに対してクエリを実行します。

下記クエリでログインの情報を取得していきます。

クエリ

select * from sys.sql_logins

 3.結果のエクスポートをクリックし、CSV形式で保存 

 SSMSではクエリの結果を右クリックし「Save Results As…..」で出力結果のエクスポートが可能です。

4.ユーザーデータベースを右クリックし、[New Query]を選択。下記クエリを実行。

 下記クエリでユーザーデータベースのユーザーの情報について取得していきます。

クエリ

select * from sys.database_principals

5.結果のエクスポートをクリックし、CSV形式で保存 

手順3と同様にクエリ結果のエクスポートをしていきます。

6.エクスポートしたCSVファイルからログイン、及びデータベースユーザーの状況を確認

取得したCSVファイルからログイン、ユーザーの状況を確認していきましょう。

想定される状況としては、

  • そもそもログインが作成されていない
  • ログインは作成されているが、ユーザーが作成されていない
  • 同じ名前のログイン、ユーザーが存在するものの、SIDが異なる

上記の理由により接続に失敗している可能性があります。

 

確認観点としては主に下記が挙げられます。

  • 「sys.sql_logins」からログインが存在するか
  • 「sys.database_principals」から、対象のユーザーが存在するか
  • 対象のユーザーと同じSIDのログインが存在するか(ログイン名が同じでもSIDが違う場合は異なるユーザーとして見なされます。)

 

対処方法は確認結果によって異なるので一概には言えませんが、下記に従い、ログインまたはユーザーの再作成で事象が改善される可能性があります。

T-SQL を使用してユーザーを作成する
オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  1. [標準] ツール バーの [新しいクエリ] をクリックします。
  2. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。

— Creates the login AbolrousHazem with password ‘340$Uuxwp7Mcxo7Khy’.
CREATE LOGIN AbolrousHazem
WITH PASSWORD = ‘340$Uuxwp7Mcxo7Khy’;
GO

— Creates a database user for the login created above.
CREATE USER AbolrousHazem FOR LOGIN AbolrousHazem;
GO
詳細については、「CREATE USER (Transact-SQL)」を参照してください。この例には、さらに多くの Transact-SQL 例が含まれています。

参考:データベース ユーザーの作成 – SQL Server | Microsoft Docs

まとめ

今回はログイン・データベースユーザーの詳細情報の確認方法を紹介しました。

SQL Server(Azure SQL Database,Azure Synapse Analytics)に接続するにはログイン、及びログインに紐づけられたデータベースユーザーが必要です。

下記のようなエラーで接続が出来ない場合は、ログイン・データベースユーザーの状況を確認してみましょう。

The server principal “xxxxxxxxxx” is not able to access the database “xxxxxxxxxx” under the current security context.

確認方法は以下となります。

ログイン:select * from sys.sql_logins

参考:sys.sql_logins (Transact-SQL) – SQL Server | Microsoft Docs

データベースユーザー:select * from sys.database_principals

参考:sys.server_principals (Transact-SQL) – SQL Server | Microsoft Docs

参考

sys.sql_logins (Transact-SQL) – SQL Server | Microsoft Docs

sys.server_principals (Transact-SQL) – SQL Server | Microsoft Docs

ログインの作成 – SQL Server | Microsoft Docs