次の方法で共有


MSSQLSERVER_4064

適用対象: SQL サーバー

詳細

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

説明

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

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

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

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

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

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

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

ユーザー アクション

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

問題を回避する

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

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

  2. オブジェクト エクスプローラーで、[Connect>データベース エンジン を選択します。

  3. サーバーに接続ダイアログボックスに入力します。

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

  5. Connection プロパティで、次のいずれかのオプションを使用して Connect to database 値を変更します。

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

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

問題を修正する

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

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

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

原因 解決策
ログインの既定のデータベースにユーザー マッピングが存在しないか、ユーザーがアクセスを拒否されました。 これらのデータベース ユーザーは、孤立したユーザーとも呼ばれます。 この問題は通常、データベースが 2 つのサーバー インスタンス間で移動されたときに発生し、4064 エラーの一般的な原因の 1 つです。 孤立したユーザーを検出して問題を解決するには、「 孤立したユーザーをトラブルシューティングする (SQL Server)を参照してください。
ログイン用のデータベース ユーザーが存在しない データベース ユーザーを作成し データベースにアクセスするための関連するアクセス許可を割り当てます。
データベース ユーザー アカウントがデータベースにアクセスするためのアクセス許可を拒否しました データベースのユーザー プロパティ (データベース ノード >Security>Users) に移動し、ユーザーが Membership ページで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 エラー メッセージが表示される場合があります。 詳細については、「 MSSQLSERVER_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_USER状態に設定されています。 データベースがRESTRICTED_USER状態に設定されている場合、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';
詳細については、「 Database States および ALTER DATABASE SET Options (Transact-SQL) - SQL Server」を参照してください。
データベースをオフライン状態のままにしておく必要があるが、影響を受けるログインの接続を有効にする必要がある場合は、既定のデータベースをサーバー上の別のデータベースに変更します。
既定のデータベースは EMERGENCY 状態に設定されます。 システム管理者によるトラブルシューティングのために、データベースが EMERGENCY 状態になっている可能性があります。 SYSadmin ロールのユーザーのみが、EMERGENCY 状態に設定されたデータベースにアクセスできます。 次のクエリを使用して、データベースをオンラインにすることができます: ALTER database <dnname> SET ONLINE;
SSMS または次のクエリを使用して、データベースが EMERGENCY 状態であるかどうかを確認できます: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';
詳細については、「 Database States および ALTER DATABASE SET Options (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 SERVER 権限の権限付与対象ユーザーである場合は、次の変更を行うときにも CONTROL SERVER 権限が必要です。 sysadmin ロールのメンバーには、これらのアクセス許可が既定で有効になっています。 詳細については、「 ALTER LOGIN (Transact-SQL)」を参照してください。

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

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

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

  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 >]