MSSQLSERVER_4064

適用対象:SQL Server

詳細

属性 Value
製品名 SQL Server
イベント ID 4064
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 DB_UFAIL_FATAL
メッセージ テキスト ユーザーの既定データベースを開けません。 ログインできませんでした。

説明

SQL Server ログインは、既定のデータベースでのログインに関連付けられているデータベース ユーザーに対するアクセス許可の問題、または既定のデータベースの問題により、SQL Server に接続できませんでした。

アクセス許可の問題には、次の 1 つ以上が考えられます。

  • ログインには、対応するマップされたユーザーが既定のデータベースに含まれません。
  • 既定のデータベースをログインに割り当てたが、指定したデータベースにユーザー マッピングを作成しなかった。
  • ログインにマップされたユーザーがアクセスを拒否されました。 (たとえば、ユーザーが誤ってdb_denydatareader固定データベース ロールに追加された場合に発生する可能性があります)。

次の理由により、接続時に既定のデータベースが使用できない場合があります。

  • 既定のデータベースは疑わしいモードです。
  • 既定のデータベースは存在しなくなりました。
  • 既定のデータベース名が正しくありません。
  • 既定のデータベースはシングル ユーザー モードであり、使用可能な唯一の接続は他のユーザーによって既に使用されています。
  • 既定のデータベースはデタッチされています。
  • 既定のデータベースは、RESTRICTED_UStandard Edition R 状態に設定されます。
  • 既定のデータベースはオフラインです。
  • 既定のデータベースは EMERGENCY 状態に設定されます。
  • 既定のデータベースは、データベース ミラーの一部です。

さらに、ログイン アカウントは複数のグループのメンバーである場合があり、これらのグループの既定のデータベースは接続時に使用できません。

SQL Server のデータベース ユーザーの詳細については、「データベース ユーザーの作成」を参照してください

ユーザー アクション

次のいずれかのアクションを実行できます。

問題を回避する

現在構成されている既定のデータベースにアクセスする必要がなく、SQL Server Management Studio (SSMS) を使用して他の操作のために SQL Server インスタンスに接続する必要がある場合は、次の手順に従います。

  1. SQL Server Management Studio (SSMS) を起動します。

  2. オブジェクト エクスプローラーで、[接続>] を選択データベース エンジン。

  3. [サーバーへの接続] ダイアログに入力します。

  4. オプションを選択します。

  5. [ 接続のプロパティ] で、次のいずれかのオプションを 使用して [データベース への接続] の値を変更します。

    • ログインが sysadmin ロールのメンバーである場合は、「接続」と入力masterして選択し、SQL Server への接続を確立します。 SQL Server に正常に接続されたら、SSMS のログインのプロパティの [全般] ページで現在使用できる別のデータベースに既定のデータベースを変更できます。 詳細については、「 ログインの作成」を参照してください。

    • ログインが sysadmin ロールのメンバーでない場合は、アクセス権があることがわかっているサーバー上のデータベース名を入力します。 または、次のようにmasterシステム データベース名を入力し、[接続] を選択することもできます。 システム管理者がデータベース内のゲスト ユーザーに対するアクセス許可を明示的に拒否した場合、この手順は master 機能しない可能性があります。 このシナリオでは、システム管理者と協力して問題を解決する必要があります。

問題を修正する

システム管理者は、次のクエリを使用して、ユーザーの現在の既定のデータベースをチェックできます。

SELECT name, default_database_name
FROM sys.server_principals
WHERE type = 'S' AND name = '<sql-login>';

次の表を使用して、関連する原因の問題を修正するための適切なアクションを決定します。

原因 解決策
ログインの既定のデータベースにユーザー マッピングが存在しないか、ユーザーがアクセスを拒否されました。 これらのデータベース ユーザーは、孤立したユーザーとも呼ばれます。 この問題は通常、データベースが 2 つのサーバー インスタンス間で移動されたときに発生し、4064 エラーの一般的な原因の 1 つです。 孤立したユーザーを検出して問題を解決するには、「孤立したユーザーのトラブルシューティング (SQL Server)」を参照してください
ログイン用のデータベース ユーザーが存在しない データベース ユーザー を作成し、データベースにアクセスするための関連するアクセス許可を割り当てます。
データベース ユーザー アカウントがデータベースにアクセスするためのアクセス許可を拒否しました データベースのユーザー プロパティ (データベース ノード>のセキュリティ>ユーザーの展開) に移動し、[メンバーシップ] ページでユーザーがdb_denydatareaderロール一部である場合はチェックします。 sys.fn_my_permissionsを使用して、ユーザーの有効なアクセス許可をチェックすることもできます。
既定のデータベースは疑わしいモードです。 データベースは、いくつかの理由で疑われる可能性があります。 考えられる原因としては、オペレーティング システムによるデータベース リソースへのアクセス拒否や、1 つ以上のデータベース ファイルの使用不能または破損などがあります。 次のクエリSELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';を使用して、データベースの状態をチェックできます。 SSMS では、疑わしいデータベースの状態は (復旧保留中) と表示されます。 この状況を解決するには、バックアップからデータベースを復旧する必要がある場合があります。
接続文字列のデータベース名が正しくありません 存在しないデータベースに接続しようとすると、次のエラー メッセージが表示されることがあります。
Cannot open database "AdventureWorks" requested by the login. The login failed.
データベース管理システム (DBMS) にもエラー メッセージが表示される Login failed for user CONTOSO\user1 場合があります。 詳細については、MSSQL Standard EditionRVER_18456 を参照してください
SQL Server エラー ログには、次のメッセージが表示されます。
"ユーザー 'CONTOSO\User1' のログインに失敗しました。 理由: 明示的に指定されたデータベース 'AdventureWorks' を開けませんでした。"
このエラーを解決するには、エラー メッセージとエラー ログ エントリの両方でデータベース名が同じであることを確認します。 接続文字列が正しくない場合は変更するか、必要なアクセス許可をユーザーに付与します。
既定のデータベースは存在しなくなりました。 サーバーからデータベースを意図的に削除した場合は、SSMS または ALTER LOGIN (Transact-SQL) ステートメントを使用して、ログインの既定のデータベースをサーバー上の別の既存のデータベースに変更します。 必要に応じて、次のクエリSELECT name AS Login_Name FROM sys.server_principals where default_database_name = '<removed-dbname>';を使用して、既定のデータベースがこの非既存データベースに設定されている他のログインがサーバーに存在する場合にチェックできます。
既定のデータベースはシングル ユーザー モードであり、唯一の接続は管理者または他のユーザーによって使用されています。 メインテナントの目的でデータベースがシングル ユーザー モードに設定されている場合は、次のクエリALTER DATABASE <dbname> SET MULTI_USER;を使用して、メインテナント アクティビティの完了後にマルチユーザー モードに戻す必要があります。
詳細については、「 データベースをシングル ユーザー モードに設定する」を参照してください。
: データベースがシングル ユーザー モードの場合にチェックするには、次のクエリSELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';を使用できます。
データベースへのアクセスを制限する必要があるが、影響を受けるログインの接続を有効にする必要がある場合は、既定のデータベースをサーバー上の別のデータベースに変更します。
既定のデータベースはデタッチされています。 データベースをデタッチすると、SQL Server のインスタンスからデータベースが削除され、アクセスできなくなります。 ログインで使用できるようにするには、SSMS またはsp_attach_db ストアド プロシージャを使用してデータベースをアタッチします。 詳細については、「データベースのデタッチとアタッチ (SQL Server)」を参照してください。
既定のデータベースは、RESTRICTED_UStandard Edition R 状態に設定されています。 データベースが RESTRICTED_UStandard Edition R 状態に設定されている場合、db_owner固定データベース ロールと dbcreator および sysadmin 固定サーバー ロールのメンバーのみがデータベースに接続できます。 対応するデータベースへのアクセスを制限する必要がなくなった場合は、次のクエリを使用して、データベースをマルチユーザー モードに設定します ALTER DATABASE <dbname> SET MULTI_USER;
: データベースが制限付きユーザー状態にある場合にチェックするには、次のクエリSELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';を使用できます。
データベースへのアクセスを制限する必要があるが、影響を受けるログインの接続を有効にする必要がある場合は、既定のデータベースをサーバー上の別のデータベースに変更します。
既定のデータベースはオフラインです。 オフライン状態のデータベースは変更できません。 次のクエリ ALTER database <dnname> SET ONLINE;を使用して、データベースをオンラインにすることができます。
データベースがオフラインの場合は、SSMS を使用するか、次のクエリSELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';を使用してチェックできます。
詳細については、「データベースの状態」および「ALTER DATABA Standard Edition Standard Edition T オプション (Transact-SQL) - SQL Server」を参照してください
データベースをオフライン状態のままにしておく必要があるが、影響を受けるログインの接続を有効にする必要がある場合は、既定のデータベースをサーバー上の別のデータベースに変更します。
既定のデータベースは EMERGENCY 状態に設定されます。 システム管理者によるトラブルシューティングのために、データベースが EMERGENCY 状態になっている可能性があります。 SYSadmin ロールのユーザーのみが、EMERGENCY 状態に設定されたデータベースにアクセスできます。 次のクエリ ALTER database <dnname> SET ONLINE;を使用して、データベースをオンラインにすることができます。
SSMS または次のクエリSELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';を使用して、データベースが EMERGENCY 状態になっているかどうかをチェックできます。
詳細については、「データベースの状態」および「ALTER DATABA Standard Edition Standard Edition T オプション (Transact-SQL)」を参照してください。
データベースを引き続き EMERGENCY 状態にしておく必要があるが、影響を受けるログインの接続を有効にする場合は、既定のデータベースをサーバー上の別のデータベースに変更します。
既定のデータベースは、データベース ミラーの一部です。 ミラー サーバー上のミラー データベースに接続することはできません。この動作は仕様に基づいて行われます。 データベースが現在ロール内にあるかどうかをチェックするには、このクエリミラー使用しますSELECT DB_NAME(database_id) as database_name, mirroring_role_desc FROM sys.database_mirroring WHERE DB_NAME(database_id) = '<dbname>';。 データベース ミラーリングの詳細については、「データベース ミラーリング (SQL Server)」を参照してください。
ログイン アカウントは複数のグループのメンバーである場合があり、接続時にいずれかのグループの既定のデータベースを使用できません。 PowerShell を使用して指定したユーザーを持つグループを列挙するには、「Get-ADPrincipalGroupMembership (ActiveDirectory)」を参照してください

特定のユーザーの既定のデータベースを変更する

ユーザーの既定のデータベースを変更するには、ALTER ANY LOGIN 権限が必要です。 変更するログインが sysadmin 固定サーバー ロールのメンバーであるか、CONTROL Standard Edition RVER 権限の権限付与対象ユーザーである場合は、次の変更を行うときに CONTROL Standard Edition RVER 権限も必要です。 sysadmin ロールのメンバーには、これらのアクセス許可が既定で有効になっています。 詳細については、「ALTER LOGIN (Transact-SQL)」を参照してください

SSMS を使用して既定のデータベースを変更する

  1. SQL Server Management Studio (SSMS) を使用して SQL Server インスタンスに接続します。

  2. [セキュリティ>ログイン] を選択してユーザーを特定し、ユーザーの既定のデータベースを、SSMS のログインのプロパティの [全般] ページで現在使用できる別のデータベースに変更します。 詳細については、「 ログインの作成」を参照してください。

  3. SQL Server インスタンスに接続した後、次の例のようなステートメントを実行 ALTER LOGIN できます。

    ALTER LOGIN <LoginName> WITH DEFAULT_DATABASE = <AvailableDatabaseName>;

    <AvailableDatabaseName> は、インスタンス内の SQL Server ログインによってアクセスできる既存のデータベースの名前のプレースホルダーです。 <LoginName> は、必要 ALTER LOGIN なアクセス許可を持つ SQL Server ログインのプレースホルダーです。

    次に例を示します。

    ALTER LOGIN [SQLLogin] WITH DEFAULT_DATABASE = master;
    ALTER LOGIN [Constoso\Windowslogin] WITH DEFAULT_DATABASE = [AdventureWorks];
    

エラー 18456 がエラー 4064 と共に表示される

エラー 4064 がユーザーに表示される SSMS などのアプリケーションを使用すると、次のメッセージが SQL Server エラー ログに記録されます。 この動作は仕様です。 この記事に記載されている手順を使用して、失敗したログインの既定のデータベースを修正すると、18456 エラーが自動的に解決されます。

2023-02-06 18:17:02.56 Logon       Error: 18456, Severity: 14, State: 40.
2023-02-06 18:17:02.56 Logon       Login failed for user '<user name>. Reason: Failed to open the database '<db_name>' specified in the login properties. [CLIENT: <hostname >]