SQL DROP-satsen är ett kommando som tar bort befintliga databaskomponenter eller hela databaserna med all deras data permanent. Det finns andra SQL-kommandon med liknande effekt (TRUNCATE eller DELETE), men det specifika med DROP-kommandot är att det raderar allt på en gång. Till exempel tar DROP TABLE bort tabelldata, indexerar, utlösare, behörigheter, begränsningar – hela tabellens schema.
DROP-satsen kräver att man är extremt försiktig när man använder den. När den väl utförts kan den inte rullas tillbaka. Informationen går förlorad för gott. Den enda chansen att returnera data är att återställa en säkerhetskopia. Ändå måste vi i många fall tillämpa DROP-satser. Den här artikeln kommer att fokusera på sådana fall, de specifika DROP-varianterna och hur man använder dem på ett säkert sätt.
Förberedelser
För att undersöka våra fall behöver vi en databas med uppgifterna. Jag har skapat en testdatabas som heter EltechEmployees med följande fråga:
USE [master]
go
CREATE DATABASE [EltechEmployees]
go
I den databasen har jag skapat en tabell tblAnställda – följande fråga tjänar till det:
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
Nästa steg är att skapa två icke-klustrade index och ett klustrat index på tblEmployees bord.
- Icke-klustrade index:IDX_tblEmployees_loginID ochIDX_tblEmployees_nationalidnumber
- Ett klustrat index:IDX _tblEmployees_gender
För att skapa dessa index, använd följande fråga:
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
Låt oss se indexen vi skapade:
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');
Utdata
Nu kan vi gå vidare till de praktiska exemplen.
Släpp indexförklaring
Vårt första fall är att ta bort index från en tabell.
Exempel 1:Släpp ett eller flera index från tabellen
Syntaxen för att ta bort flera index är följande:
Drop index
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName]
- Indexnamn: Ange indexnamnet du vill ta bort efter uttalandet Drop Index .
- [Schemanamn].[Tabellnamn]: Ange databasnamn, schemanamn och tabellnamn. Drop table-satsen låter dig använda det tvådelade namnet på vilket databasobjekt som helst. Värdena för [SchemaName].[TableName] måste anges efter nyckelordet ON .
Anta att vi vill ta bort IX_loginID_tblAnställda och IDX_nationalidnumber_tblEmployees på tblEmployees tabell. För att göra det, kör nedanstående fråga:
DROP INDEX
[IDX_tblEmployees_loginID] ON [dbo].[tblEmployees],
[IDX_tblEmployees_nationalidnumber] ON [dbo].[tblEmployees]
När index har släppts, kör följande fråga för att visa dem:
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');
Utdata
Exempel 2:Släpp index med MAXDOP och ONLINE-alternativ.
Vi kan använda MAXDOP- och ONLINE-alternativen medan vi släpper indexet.
Obs :Vi kan bara ta bort klustrade index med MAXDOP- och ONLINE-alternativ.
Syntaxen är följande:
DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
- Indexnamn: Ange det indexnamn du vill ta bort.
- [Schemanamn].[Tabellnamn]: Ange det tredelade namnet på tabellen.
- @MaxDop_val: Ange värdet för parametern MAXDOP.
- @online_option: De giltiga värdena är PÅ och AV.
Anta att vi vill ta bort PK_Employee_BusinessEntityID index med MAXDOP- och ONLINE-alternativ.
Släpp indexet med värdet för MAXDOP-alternativet till 5, och ONLINE-alternativet är PÅ. Frågan för att ta bort indexet är följande:
DROP INDEX [IDX_tblEmployees_gender] ON [dbo].[tblEmployees] WITH (maxdop=5,
online=ON)
Alla index har tagits bort från tblEmployees bord.
SQL Drop Table Statement
DROP TABLE-satsen tar bort tabellen från vilken databas som helst. Syntaxen för DROP TABLE är följande:
DROP TABLE [DatabaseName].[SchemaName].[TableName]
[Databasnamn].[Schemanamn].[Tabellnamn]: Ange tabellnamnet. Du kan använda tabellens tredelade namn.
Behörigheter
Användaren måste ha ALTER behörighet för schemat där tabellen har skapats och kontrollen behörighet på bordet, eller vara medlem i db_ddladmin fast roll.
Obs!
- Om du släpper en tabell som refereras av en främmande nyckel måste du först släppa den referenstabellen.
- När du släpper en tabell med en kolumn som har attributet FILESTREAM, kommer data som lagras i filsystemet inte att tas bort.
Exempel 1:Släpp ett fysiskt bord
I följande exempel släpper vi tabellen med namnet tblAnställda från Eltech-anställda databas:
Drop table [EltechEmployees].[dbo].[tblEmployees]
Exempel 2:Släpp en tillfällig tabell
Här släpper vi ett tillfälligt bord. Jag har skapat en temptabell med namnet #tblAnställd genom att köra följande kod:
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
Innan vi släpper tabellen kontrollerar vi att temptabellen finns. Om tabellen hittas kommer den att tas bort.
IF Object_id(N'tempdb..#tblEmployees', N'U') IS NOT NULL
DROP TABLE #tblemployees;
go
Således, den tillfälliga tabellen #tblAnställda kommer att tas bort.
Släpp databasutlåtande
Drop databassatsen fungerar för att ta bort hela databasen. Syntaxen är följande:
Drop database [DatabaseName]
[Databasnamn] :Ange namnet på databasnamnet som du vill ta bort.
Behörigheter
För att ta bort databasen behöver du KONTROLL eller ÄNDRA NÅGON DATABAS behörighet på databasen. Eller så måste du vara medlem i db_owner fast databasroll.
Anteckningar :
- När vi släpper någon databas i ONLINE tillstånd kommer SQL Server att ta bort databasfilerna från disken. Men om du släpper databasen i OFFLINE tillstånd, släpper inte SQL Server databasfilerna. Vi måste ta bort dem manuellt.
- För att ta bort databasen som publicerats för transaktioner eller publicerad/prenumererad på sammanslagningsreplikeringen måste vi förstöra replikeringen och sedan släppa databasen.
- Om användare är anslutna till databasen kan vi inte släppa databasen. Först måste vi ändra dess tillstånd till SINGLE_USER .
Exempel:Släpp databasen som används
Vi vill ta bort Eltech-anställda databas. För att göra det, kör följande fråga:
USE master
go
DROP DATABASE [EltechEmployees]
Om användare är anslutna till databasen kommer du att stöta på följande fel:
Msg 3702, Level 16, State 4, Line 3
Cannot drop database "EltechEmployees" because it is currently in use.
För att åtgärda felet måste vi utföra följande fråga:
USE [master]
go
ALTER DATABASE eltechemployees SET single_user WITH ROLLBACK immediate
Ovanstående fråga ställer in databasen i SINGLE_USER läge och släpper alla användare som är anslutna till databasen.
Låt oss nu köra DROP DATABASE-satsen:
USE master
go
DROP DATABASE [EltechEmployees]
Utdata
Som du kan se kördes kommandot framgångsrikt.
Sammanfattning
Därför har vi undersökt DROP INDEX-, DROP TABLE- och DROP DATABASE-satserna specifika varianter av SQL DROP-satsen. Hoppas att de praktiska exemplen som presenteras i den här artikeln hjälpte till att förklara hur och när man använder dessa kommandon.