SQL příkaz DROP je příkaz, který trvale smaže existující databázové komponenty nebo celé databáze se všemi jejich daty. Existují další SQL příkazy s podobným účinkem (TRUNCATE nebo DELETE), ale specifikum příkazu DROP je v tom, že smaže vše najednou. Například DROP TABLE odstraní data tabulky, indexy, spouštěče, oprávnění, omezení – celé schéma tabulky.
Příkaz DROP vyžaduje, aby byl člověk při jeho používání extrémně opatrný. Po provedení jej nelze vrátit zpět. Informace jsou nadobro ztraceny. Jedinou šancí na vrácení dat bude obnovení zálohy. Přesto v mnoha případech musíme použít příkazy DROP. Tento článek se zaměří na takové případy, konkrétní varianty DROP a na to, jak je bezpečně používat.
Přípravy
K prozkoumání našich případů budeme potřebovat databázi s daty. Vytvořil jsem testovací databázi s názvem EltechEmployees s následujícím dotazem:
USE [master]
go
CREATE DATABASE [EltechEmployees]
go
V této databázi jsem vytvořil tabulku tblEmployees – k tomu slouží následující dotaz:
USE [EltechEmployees]
go
CREATE TABLE [tblEmployees]
(
[businessentityid] [INT] NOT NULL,
[nationalidnumber] [NVARCHAR](15) NOT NULL,
[loginid] [NVARCHAR](256) NOT NULL,
[jobtitle] [NVARCHAR](50) NOT NULL,
[birthdate] [DATE] NOT NULL,
[maritalstatus] [NCHAR](1) NOT NULL,
[gender] [NCHAR](1) NOT NULL,
[hiredate] [DATE] NOT NULL,
[vacationhours] [SMALLINT] NOT NULL,
[sickleavehours] [SMALLINT] NOT NULL,
[modifieddate] [DATETIME] NOT NULL
)
go
Dalším krokem je vytvoření dvou neklastrovaných indexů a jednoho klastrovaného indexu na tblEmployees tabulka.
- Indexy bez klastrů:IDX_tblEmployees_loginID aIDX_tblEmployees_nationalidnumber
- Jeden seskupený index:IDX _tblEmployees_gender
Chcete-li vytvořit tyto indexy, použijte následující dotaz:
USE [EltechEmployees]
go
CREATE INDEX [IDX_tblEmployees_loginID] ON [tblEmployees](loginid)
go
CREATE INDEX [IDX_tblEmployees_nationalidnumber] ON [tblEmployees](nationalidnumber)
go
CREATE Clustered INDEX [IDX_tblEmployees_gender] ON [tblEmployees](gender)
go
Podívejme se na indexy, které jsme vytvořili:
SELECT Object_name([Index].object_id) [Table Name]
,
[Index].NAME
[Index Name]
,
Col_name([Index Column].object_id, [Index Column].column_id)
[Index Column_Name],
[Index Column].index_column_id,
CASE
WHEN is_primary_key = 1 THEN 'Yes'
ELSE 'No'
END
[Is Primary Key],
CASE
WHEN is_unique = 1 THEN 'Yes'
ELSE 'No'
END
[Is Unique Key]
FROM sys.indexes AS [Index]
INNER JOIN sys.index_columns AS [Index Column]
ON [Index].object_id = [Index Column].object_id
AND [Index].index_id = [Index Column].index_id
WHERE [Index].is_hypothetical = 0
AND [Index].object_id = Object_id('tblEmployees');
Výstup
Nyní můžeme přejít k praktickým příkladům.
Drop Index Statement
Náš první případ je vypuštění indexů z tabulky.
Příklad 1:Vypuštění jednoho nebo více indexů z tabulky
Syntaxe pro zrušení více indexů je následující:
Drop index
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName]
- Název indexu: Zadejte název indexu, který chcete vypustit po příkazu Drop Index .
- [SchemaName].[TableName]: Zadejte název databáze, název schématu a název tabulky. Příkaz Drop table umožňuje použít dvoudílný název libovolného databázového objektu. Hodnoty [SchemaName].[TableName] musí být uvedeno za klíčovým slovem ON .
Předpokládejme, že chceme vyřadit IX_loginID_tblEmployees a IDX_nationalidnumber_tblEmployees na tblEmployees stůl. Chcete-li to provést, spusťte níže uvedený dotaz:
DROP INDEX
[IDX_tblEmployees_loginID] ON [dbo].[tblEmployees],
[IDX_tblEmployees_nationalidnumber] ON [dbo].[tblEmployees]
Jakmile jsou indexy zrušeny, spusťte následující dotaz a zobrazte je:
SELECT Object_name([Index].object_id) [Table Name]
,
[Index].NAME
[Index Name]
,
Col_name([Index Column].object_id, [Index Column].column_id)
[Index Column_Name],
[Index Column].index_column_id,
CASE
WHEN is_primary_key = 1 THEN 'Yes'
ELSE 'No'
END
[Is Primary Key],
CASE
WHEN is_unique = 1 THEN 'Yes'
ELSE 'No'
END
[Is Unique Key]
FROM sys.indexes AS [Index]
INNER JOIN sys.index_columns AS [Index Column]
ON [Index].object_id = [Index Column].object_id
AND [Index].index_id = [Index Column].index_id
WHERE [Index].is_hypothetical = 0
AND [Index].object_id = Object_id('tblEmployees');
Výstup
Příklad 2:Pokles indexu pomocí MAXDOP a ONLINE Option.
Při odstraňování indexu můžeme použít možnosti MAXDOP a ONLINE.
Poznámka :Můžeme zrušit pouze seskupený index pomocí možností MAXDOP a ONLINE.
Syntaxe je následující:
DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
- Název indexu: Zadejte název indexu, který chcete odstranit.
- [SchemaName].[TableName]: Zadejte třídílný název tabulky.
- @MaxDop_val: Zadejte hodnotu parametru MAXDOP.
- @online_option: Platné hodnoty jsou ON a OFF.
Předpokládejme, že chceme vypustit PK_Employee_BusinessEntityID index s možnostmi MAXDOP a ONLINE.
Zrušte index pomocí hodnoty možnosti MAXDOP na 5 a možnost ONLINE je zapnutá. Dotaz na zrušení indexu je následující:
DROP INDEX [IDX_tblEmployees_gender] ON [dbo].[tblEmployees] WITH (maxdop=5,
online=ON)
Všechny indexy byly odstraněny z tblEmployees tabulka.
Příkaz SQL Drop Table
Příkaz DROP TABLE odstraní tabulku z jakékoli databáze. Syntaxe DROP TABLE je následující:
DROP TABLE [DatabaseName].[SchemaName].[TableName]
[DatabaseName].[SchemaName].[TableName]: Zadejte název tabulky. Můžete použít třídílný název tabulky.
Oprávnění
Uživatel musí mít ALTER oprávnění ke schématu, kde byla tabulka vytvořena, a Ovládací prvek povolení na stůl, nebo být členem db_ddladmin pevná role.
Poznámka:
- Pokud zrušíte tabulku, na kterou odkazuje cizí klíč, musíte nejprve zrušit tuto referenční tabulku.
- Když zrušíte tabulku se sloupcem s atributem FILESTREAM, data uložená v systému souborů nebudou odstraněna.
Příklad 1:Vypuštění fyzické tabulky
V následujícím příkladu vypouštíme tabulku s názvem tblEmployees od EltechEmployees databáze:
Drop table [EltechEmployees].[dbo].[tblEmployees]
Příklad 2:Vypuštění dočasné tabulky
Zde rušíme dočasnou tabulku. Vytvořil jsem dočasnou tabulku s názvem #tblEmployee spuštěním následujícího kódu:
CREATE TABLE [#tblemployees]
(
[businessentityid] [INT] NOT NULL,
[nationalidnumber] [NVARCHAR](15) NOT NULL,
[loginid] [NVARCHAR](256) NOT NULL,
[jobtitle] [NVARCHAR](50) NOT NULL,
[birthdate] [DATE] NOT NULL,
[maritalstatus] [NCHAR](1) NOT NULL,
[gender] [NCHAR](1) NOT NULL,
[hiredate] [DATE] NOT NULL,
[vacationhours] [SMALLINT] NOT NULL,
[sickleavehours] [SMALLINT] NOT NULL,
[modifieddate] [DATETIME] NOT NULL
)
go
Před zrušením tabulky zkontrolujeme existenci dočasné tabulky. Pokud je tabulka nalezena, bude zrušena.
IF Object_id(N'tempdb..#tblEmployees', N'U') IS NOT NULL
DROP TABLE #tblemployees;
go
Tedy dočasná tabulka #tblEmployees bude zrušeno.
Zrušte příkaz databáze
Příkaz Drop Database funguje tak, že zruší celou databázi. Syntaxe je následující:
Drop database [DatabaseName]
[DatabaseName] :Zadejte název názvu databáze, kterou chcete odstranit.
Oprávnění
Chcete-li databázi zrušit, potřebujete CONTROL nebo ZMĚŇTE JAKOUKOLIV DATABÁZI oprávnění k databázi. Nebo musíte být členem db_owner pevná databázová role.
Poznámky :
- Když pustíme jakoukoli databázi do ONLINE stavu, SQL Server stáhne databázové soubory z disku. Pokud však upouštíte databázi do OFFLINE stavu, SQL Server nepustí databázové soubory. Musíme je odstranit ručně.
- Chcete-li zrušit databázi publikovanou pro transakční nebo publikovanou/přihlášenou ke slučovací replikaci, musíme replikaci zničit a poté zrušit databázi.
- Pokud jsou uživatelé připojeni k databázi, nemůžeme databázi zrušit. Nejprve musíme změnit jeho stav na SINGLE_USER .
Příklad:Zrušte databázi, která se používá
Chceme vyřadit EltechEmployees databáze. Chcete-li to provést, spusťte následující dotaz:
USE master
go
DROP DATABASE [EltechEmployees]
Pokud jsou uživatelé připojeni k databázi, objeví se následující chyba:
Msg 3702, Level 16, State 4, Line 3
Cannot drop database "EltechEmployees" because it is currently in use.
Abychom chybu napravili, musíme provést následující dotaz:
USE [master]
go
ALTER DATABASE eltechemployees SET single_user WITH ROLLBACK immediate
Výše uvedený dotaz nastaví databázi do SINGLE_USER režimu a zruší všechny uživatele připojené k databázi.
Nyní spusťte příkaz DROP DATABASE:
USE master
go
DROP DATABASE [EltechEmployees]
Výstup
Jak vidíte, příkaz byl úspěšně proveden.
Shrnutí
Zkoumali jsme tedy specifické varianty příkazů SQL DROP příkazů DROP INDEX, DROP TABLE a DROP DATABASE. Doufám, že praktické příklady uvedené v tomto článku pomohly vysvětlit, jak a kdy tyto příkazy použít.