De SQL DROP-instructie is een opdracht die bestaande databasecomponenten of de volledige databases met al hun gegevens permanent verwijdert. Er zijn andere SQL-commando's met een soortgelijk effect (TRUNCATE of DELETE), maar het specifieke van het DROP-commando is dat het alles in één keer verwijdert. DROP TABLE verwijdert bijvoorbeeld de tabelgegevens, indexen, triggers, machtigingen, beperkingen - het volledige schema van de tabel.
De DROP-instructie vereist dat men uiterst voorzichtig is bij het gebruik ervan. Eenmaal uitgevoerd, kan het niet worden teruggedraaid. De informatie is voorgoed verloren. De enige kans om de gegevens terug te geven, is door een back-up te herstellen. Toch moeten we in veel gevallen DROP-statements toepassen. Dit artikel gaat in op dergelijke gevallen, de specifieke DROP-varianten en hoe u ze veilig kunt gebruiken.
Voorbereidingen
Om onze gevallen te onderzoeken, hebben we een database met de gegevens nodig. Ik heb een testdatabase gemaakt met de naam EltechEmployees met de volgende vraag:
USE [master]
go
CREATE DATABASE [EltechEmployees]
go
In die database heb ik een tabel gemaakt tblEmployees – daarvoor dient de volgende vraag:
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
De volgende stap is het maken van twee niet-geclusterde indexen en één geclusterde index op de tblEmployees tafel.
- Niet-geclusterde indexen:IDX_tblEmployees_loginID en IDX_tblEmployees_nationalidnumber
- Eén geclusterde index:IDX _tblEmployees_gender
Gebruik de volgende query om deze indexen te maken:
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
Laten we de indexen bekijken die we hebben gemaakt:
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');
Uitvoer
Nu kunnen we overgaan tot de praktische voorbeelden.
Indexverklaring laten vallen
Ons eerste geval is het laten vallen van indexen uit een tabel.
Voorbeeld 1:Verwijder een of meerdere indexen van de tabel
De syntaxis om meerdere indexen te verwijderen is als volgt:
Drop index
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName]
- Indexnaam: Specificeer de indexnaam die u wilt verwijderen na de Drop Index-instructie .
- [Schemanaam].[Tabelnaam]: Geef de databasenaam, schemanaam en tabelnaam op. Met de instructie Drop table kunt u de tweedelige naam van elk databaseobject gebruiken. De waarden van [SchemaName].[TableName] moet worden opgegeven na het ON-zoekwoord .
Stel dat we IX_loginID_tblEmployees willen verwijderen en IDX_nationalidnumber_tblEmployees op de tblEmployees tafel. Voer hiervoor de onderstaande query uit:
DROP INDEX
[IDX_tblEmployees_loginID] ON [dbo].[tblEmployees],
[IDX_tblEmployees_nationalidnumber] ON [dbo].[tblEmployees]
Zodra indexen zijn verwijderd, voert u de volgende query uit om ze te bekijken:
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');
Uitvoer
Voorbeeld 2:Drop Index met MAXDOP en ONLINE-optie.
We kunnen de MAXDOP- en ONLINE-opties gebruiken terwijl we de index laten vallen.
Opmerking :We kunnen alleen geclusterde index verwijderen met behulp van MAXDOP en ONLINE opties.
De syntaxis is als volgt:
DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
- Indexnaam: Geef de indexnaam op die u wilt verwijderen.
- [Schemanaam].[Tabelnaam]: Geef de driedelige naam van de tabel op.
- @MaxDop_val: Specificeer de waarde van de MAXDOP-parameter.
- @online_option: De geldige waarden zijn AAN en UIT.
Stel dat we de PK_Employee_BusinessEntityID willen laten vallen index met MAXDOP en ONLINE opties.
Verlaag de index met de waarde van de MAXDOP-optie naar 5 en de ONLINE-optie is AAN. De vraag om de index te verwijderen is als volgt:
DROP INDEX [IDX_tblEmployees_gender] ON [dbo].[tblEmployees] WITH (maxdop=5,
online=ON)
Alle indexen zijn verwijderd uit de tblEmployees tafel.
SQL Drop Table-instructie
De DROP TABLE-instructie verwijdert de tabel uit elke database. De syntaxis van de DROP TABLE is als volgt:
DROP TABLE [DatabaseName].[SchemaName].[TableName]
[DatabaseNaam].[SchemaNaam].[TabelNaam]: Geef de tabelnaam op. U kunt de driedelige naam van de tabel gebruiken.
Machtigingen
De gebruiker moet de ALTER . hebben toestemming voor het schema waar de tabel is gemaakt en de Control toestemming op de tafel, of wees lid van de db_ddladmin vaste rol.
Opmerking:
- Als u een tabel verwijdert waarnaar wordt verwezen door een externe sleutel, moet u eerst die verwijzingstabel verwijderen.
- Als u een tabel verwijdert met een kolom met het kenmerk FILESTREAM, worden de gegevens die in het bestandssysteem zijn opgeslagen niet verwijderd.
Voorbeeld 1:Zet een fysieke tafel neer
In het volgende voorbeeld laten we de tabel met de naam tblEmployees vallen van de EltechEmployees databank:
Drop table [EltechEmployees].[dbo].[tblEmployees]
Voorbeeld 2:Een tijdelijke tafel neerzetten
Hier laten we een tijdelijke tafel vallen. Ik heb een tijdelijke tabel gemaakt met de naam #tblEmployee door de volgende code uit te voeren:
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
Voordat we de tabel laten vallen, controleren we het bestaan van de tijdelijke tabel. Als de tafel wordt gevonden, wordt deze verwijderd.
IF Object_id(N'tempdb..#tblEmployees', N'U') IS NOT NULL
DROP TABLE #tblemployees;
go
Dus de tijdelijke tabel #tblEmployees zal worden verwijderd.
Drop Database Statement
Drop database statement werkt om de hele database te laten vallen. De syntaxis is als volgt:
Drop database [DatabaseName]
[Databasenaam] :Specificeer de naam van de databasenaam die u wilt verwijderen.
Machtigingen
Om de database te laten vallen, heb je de CONTROL . nodig of ELKE DATABASE WIJZIGEN toestemming voor de database. Of u moet lid zijn van de db_owner vaste databaserol.
Opmerkingen :
- Als we een database in de ONLINE plaatsen staat, zal de SQL Server de databasebestanden van de schijf laten vallen. Als u de database echter laat vallen in de OFFLINE staat, laat de SQL Server de databasebestanden niet vallen. We moeten ze handmatig verwijderen.
- Als we de database willen verwijderen die is gepubliceerd voor transactie of die is gepubliceerd/geabonneerd op de samenvoegreplicatie, moeten we de replicatie vernietigen en vervolgens de database verwijderen.
- Als gebruikers zijn verbonden met de database, kunnen we de database niet verwijderen. Eerst moeten we de status wijzigen in SINGLE_USER .
Voorbeeld:verwijder de database die wordt gebruikt
We willen de EltechEmployees laten vallen databank. Voer hiervoor de volgende query uit:
USE master
go
DROP DATABASE [EltechEmployees]
Als gebruikers zijn verbonden met de database, zult u de volgende fout tegenkomen:
Msg 3702, Level 16, State 4, Line 3
Cannot drop database "EltechEmployees" because it is currently in use.
Om de fout te herstellen, moeten we de volgende query uitvoeren:
USE [master]
go
ALTER DATABASE eltechemployees SET single_user WITH ROLLBACK immediate
De bovenstaande query zet de database in de SINGLE_USER modus en verwijdert alle gebruikers die verbonden zijn met de database.
Laten we nu het DROP DATABASE-statement uitvoeren:
USE master
go
DROP DATABASE [EltechEmployees]
Uitvoer
Zoals je kunt zien, is de opdracht met succes uitgevoerd.
Samenvatting
Daarom hebben we de specifieke varianten van de SQL DROP-instructie voor DROP INDEX, DROP TABLE en DROP DATABASE onderzocht. Ik hoop dat de praktische voorbeelden in dit artikel hebben geholpen om uit te leggen hoe en wanneer deze commando's moeten worden toegepast.