DROP DATABASE (Transact-SQL)
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
SQL Server データベース エンジンのインスタンスから 1 つ以上のユーザー データベースまたはデータベース スナップショットを削除します。
構文
SQL Server 構文。
DROP DATABASE [ IF EXISTS ] { database_name | database_snapshot_name } [ ,...n ]
[ ; ]
Azure SQL Database、Azure Synapse Analytics、Analytics プラットフォーム システムの構文。
DROP DATABASE database_name
[ ; ]
引数
IF EXISTS
適用対象: SQL Server 2016 (13.x) 以降のバージョン
条件付きでは既に存在する場合にのみ、データベースを削除します。
database_name
削除するデータベースの名前を指定します。 データベースの一覧を表示するには、sys.databases カタログ ビューを使用します。
database_snapshot_name
削除するデータベース スナップショットの名前を指定します。
解説
データベースは、オフライン、読み取り専用、未確認などの状態に関係なくドロップすることができます。 データベースの現在の状態を表示するには、 sys.databases
カタログ ビューを使用します。
削除されたデータベースは、バックアップを復元することによってのみ、再作成できます。 データベース スナップショットはバックアップできないため、復元できません。
データベースを削除する場合は、master データベースをバックアップする必要があります。
データベースを削除すると、SQL Server のインスタンスからそのデータベースが削除され、そのデータベースで使用されている物理ディスク ファイルも削除されます。 データベースまたはそのいずれかのファイルが削除されたときにオフラインになっている場合、ディスク ファイルは削除されません。 これらのファイルは、エクスプローラーなどのファイル マネージャーを使用して手動で削除できます。 ファイルをファイル システムから削除せずにデータベースを現在のサーバーから削除するには、sp_detach_db を使用します。
警告
SQL Server 2016 (13.x) 以降のバージョンでは、 FILE_SNAPSHOT
バックアップが関連付けられているデータベースの削除は成功しますが、これらのデータベース ファイルを参照するバックアップが無効にならないように、スナップショットが関連付けられているデータベース ファイルは削除されません。 ファイルは切り捨てられますが、 FILE_SNAPSHOT
バックアップをそのまま維持するために物理的に削除されることはありません。 詳細については、「azure Blob Storage を使用した SQL Server のバックアップと復元を参照してください。
SQL Server
データベース スナップショットを削除すると、SQL Server のインスタンスからデータベース スナップショットが削除され、スナップショットで使用される物理 NTFS ファイル システムスパース ファイルが削除されます。 データベース スナップショットによるスパース ファイルの使用については、「 Database スナップショット (SQL Server)」を参照してください。 データベース スナップショットを削除すると、インスタンス全体ではなく、データベース スナップショットに関連付けられているプラン キャッシュ内のエントリがクリアされます。 プラン キャッシュが消去されると、後続のすべての実行プランが再コンパイルされ、場合によっては、クエリ パフォーマンスが一時的に急激に低下します。
プラン キャッシュ内のクリアされたキャッシュストアごとに、SQL Server エラー ログに次の情報メッセージが含まれています。 このメッセージは、5 分以内にキャッシュがフラッシュされる限り、5 分間隔でログに記録されます。
SQL Server has encountered %d occurrence(s) of cachestore flush for the '%s' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
相互運用性
SQL Server
トランザクション レプリケーションに対してパブリッシュされたデータベース、あるいは、マージ レプリケーションに対してパブリッシュまたはサブスクライブされたデータベースを削除するには、まず、データベースからレプリケーションを削除する必要があります。 データベースが破損している場合、またはレプリケーションを最初に削除できない場合 (またはその両方)、ほとんどの場合、 ALTER DATABASE
を使用してデータベースをオフラインに設定してから削除することで、データベースを削除できます。
データベースがログ配布に関与している場合は、データベースを削除する前にログ配布を削除します。 詳細については、「ログ配布について(SQL Server)」を参照してください。
制限事項
システム データベース を削除できません。
DROP DATABASE
ステートメントは自動コミット モードで実行する必要があり、明示的または暗黙的なトランザクションでは使用できません。 自動コミット モードは、既定のトランザクション管理モードです。
警告
現在使用されているデータベースを削除することはできません。 つまり、いずれのユーザーによる読み取りまたは書き込みに対してもロックがかかります。 データベースからユーザーを削除する方法の 1 つは、 ALTER DATABASE
を使用してデータベースを SINGLE_USER に設定することです。 この戦略では、単一ユーザー セッションが許可される別の接続要求を回避するために、同じバッチで ALTER DATABASE
と DROP DATABASE
を実行する必要があります。 詳細については、「 Example D」を参照してください。
SQL Server
データベースを削除する前に、そのデータベース上のすべてのデータベース スナップショットを削除する必要があります。
Stretch Database のデータベース 有効化を削除しても、リモート データは削除されません。 リモートのデータを削除する場合は、手動で削除する必要があります。
重要
拡張データベースは、SQL Server 2022 (16.x) および Azure SQL Database では非推奨になります。 この機能は、データベース エンジンの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。
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. 単一データベースを削除する
次の例では、Sales
データベースを削除します。
DROP DATABASE Sales;
B. 複数のデータベースを削除する
次の例では、一覧表示された各データベースを削除します。
DROP DATABASE Sales, NewSales;
C: データベース スナップショットを削除する
次の例では、sales_snapshot0600
というデータベース スナップショットを、ソース データベースには影響を与えずに削除します。
DROP DATABASE sales_snapshot0600;
D. データベースが存在するかどうかを確認した後にデータベースを削除する
次の例では、最初に Sales
という名前のデータベースが存在するかどうかを確認します。 その場合、この例では、Sales
という名前のデータベースをシングルユーザー モードに変更することで他のすべてのセッションを強制的に切断してから、データベースをドロップします。 SINGLE_USER の詳細については、ALTER DATABASE SET オプションに関するページを参照してください。
USE tempdb;
GO
DECLARE @SQL AS 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;';
EXECUTE (@SQL);
END