DROP DATABASE (Transact-SQL)

適用対象: はいSQL Server (サポートされているすべてのバージョン) はいAzure SQL データベース はいAzure SQL Managed Instance はいAzure Synapse Analytics はいParallel Data Warehouse

1 つ以上のユーザー データベースまたはデータベース スナップショットを SQL Server のインスタンスから削除します。

トピック リンク アイコン Transact-SQL 構文表記規則

構文

-- SQL Server Syntax
DROP DATABASE [ IF EXISTS ] { database_name | database_snapshot_name } [ ,...n ] [;]
-- Azure SQL Database, Azure Synapse Analytics and Analytics Platform System Syntax
DROP DATABASE database_name [;]

注意

SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

IF EXISTS
適用対象: SQL Server (SQL Server 2016 (13.x) から 現在のバージョンまで)。

条件付きでは既に存在する場合にのみ、データベースを削除します。

database_name 削除するデータベースの名前を指定します。 データベースの一覧を表示するには、sys.databases カタログ ビューを使用します。

database_snapshot_name 適用対象: SQL Server 2008 以降。

削除するデータベース スナップショットの名前を指定します。

全般的な解説

データベースは、オフライン、読み取り専用、未確認などの状態に関係なくドロップすることができます。 データベースの現在の状態を表示するには、sys.databases カタログ ビューを使用します。

削除されたデータベースは、バックアップを復元することによってのみ、再作成できます。 データベース スナップショットはバックアップできません。したがって復元もできません。

データベースを削除する場合は、master データベースをバックアップする必要があります。

データベースを削除すると、SQL Server のインスタンスからそのデータベースが削除され、そのデータベースで使用されている物理ディスク ファイルも削除されます。 削除の際にデータベースまたはディスク ファイルのいずれかがオフラインの場合、ディスク ファイルは削除されません。 これらのファイルは Windows エクスプローラーを使用して手動で削除できます。 ファイルをファイル システムから削除せずにデータベースを現在のサーバーから削除するには、sp_detach_db を使用します。

警告

FILE_SNAPSHOT を持つデータベースを削除すると、関連付けられているバックアップは成功しますが、スナップショットが関連付けられているデータベース ファイルは、これらのデータベース ファイルを参照するバックアップの無効化を回避するためには削除されません。 ファイルは切り捨てられますが、FILE_SNAPSHOT のバックアップをそのままの状態に保つために物理的には削除されません。 詳細については、「Windows Azure BLOB ストレージ サービスを使用した SQL Server のバックアップと復元」を参照してください。 適用対象: SQL Server 2016 (13.x) から 現在のバージョンまで。

SQL Server

データベース スナップショットを削除すると、SQL Server のインスタンスからデータベース スナップショットが削除され、スナップショットで使用されている物理的な NTFS ファイル システムのスパース ファイルが削除されます。 データベース スナップショットによるスパース ファイルの使用の詳細については、データベース スナップショットに関するページを参照してください。 データベース スナップショットを削除すると、SQL Server のインスタンスのプラン キャッシュが消去されます。 プラン キャッシュが消去されると、後続のすべての実行プランが再コンパイルされ、場合によっては、クエリ パフォーマンスが一時的に急激に低下します。 プラン キャッシュ内のキャッシュストアが消去されるたびに、"SQL Server は、一部のデータベース メンテナンス操作または再構成操作により、'%s' キャッシュストア (プラン キャッシュの一部) のキャッシュストア フラッシュを %d 個検出しました" という情報メッセージが SQL Server エラー ログに含まれます。 このメッセージは、5 分以内にキャッシュがフラッシュされる限り、5 分間隔でログに記録されます。

相互運用性

SQL Server

トランザクション レプリケーションに対してパブリッシュされたデータベース、あるいは、マージ レプリケーションに対してパブリッシュまたはサブスクライブされたデータベースを削除するには、まず、データベースからレプリケーションを削除する必要があります。 データベースが損傷している場合またはレプリケーションを最初に削除できない場合、あるいはその両方の場合であっても、ALTER DATABASE を使用してデータベースをオフラインに設定してから削除すると、ほとんどの場合、データベースを削除できます。

データベースがログ配布に関与している場合は、データベースを削除する前にログ配布を削除します。 詳しくは、「 ログ配布について」をご覧ください。

制限事項と制約事項

システム データベースは削除できません。

DROP DATABASE ステートメントは、自動コミット モードで実行する必要があり、明示的または暗黙的なトランザクションでは許可されません。 自動コミット モードは、既定のトランザクション管理モードです。

警告

使用中のデータベースは削除できません。 つまり、いずれのユーザーによる読み取りまたは書き込みに対してもロックがかかります。 データベースからユーザーを削除するには、ALTER DATABASE を使用して、データベースを SINGLE_USER に設定する方法があります。 この方法では、許可されている単一ユーザー セッションを要求する別の接続を回避するために、同じバッチ内で ALTER DATABASE と DROP DATABASE を実行する必要があります。 後述する例 D を参照してください。

SQL Server

データベースを削除する前に、そのデータベース上のすべてのデータベース スナップショットを削除する必要があります。

Stretch データベースのデータベースの有効化を削除しても、リモートのデータは削除されません。 リモートのデータを削除する場合は、手動で削除する必要があります。

Azure SQL データベース

データベースを削除するには、master データベースに接続する必要があります。

DROP DATABASE ステートメントは SQL バッチ内の唯一のステートメントである必要があります。また、一度に削除できるデータベースは 1 つだけです。

Azure Synapse Analytics

データベースを削除するには、master データベースに接続する必要があります。

DROP DATABASE ステートメントは SQL バッチ内の唯一のステートメントである必要があります。また、一度に削除できるデータベースは 1 つだけです。

アクセス許可

SQL Server

データベースの CONTROL 権限、ALTER ANY DATABASE 権限、または db_owner 固定データベース ロールのメンバーシップが必要です。

Azure SQL データベース

データベースを削除できるのは、(プロビジョニング プロセスによって作成される) サーバーレベル プリンシパルのログイン、または dbmanager データベース ロールのメンバーだけです。

Analytics Platform System (PDW)

データベースの CONTROL 権限、ALTER ANY DATABASE 権限、または db_owner 固定データベース ロールのメンバーシップが必要です。

A. 1 つのデータベースを削除する

次の例では、Sales データベースを削除します。

DROP DATABASE Sales;

B. 複数のデータベースを削除する

適用対象: SQL Server 2008 以降。

次の例では、一覧表示された各データベースを削除します。

DROP DATABASE Sales, NewSales;

C. データベース スナップショットを削除する

適用対象: SQL Server 2008 以降。

次の例では、sales_snapshot0600 というデータベース スナップショットを、ソース データベースには影響を与えずに削除します。

DROP DATABASE sales_snapshot0600;

D. データベースが存在するかどうかを確認した後にそれを削除する

次の例では、最初に Sales という名前のデータベースが存在するかどうかを確認します。 その場合、この例では、Sales という名前のデータベースをシングルユーザー モードに変更することで他のすべてのセッションを強制的に切断してから、データベースをドロップします。 SINGLE_USER の詳細については、ALTER DATABASE SET オプションに関するページを参照してください。

USE tempdb;
GO
DECLARE @SQL nvarchar(1000);
IF EXISTS (SELECT 1 FROM sys.databases WHERE [name] = N'Sales')
BEGIN
    SET @SQL = N'USE [Sales];

                 ALTER DATABASE Sales SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
                 USE [tempdb];

                 DROP DATABASE Sales;';
    EXEC (@SQL);
END;

参照