SQL DROP-sætningen er en kommando, der sletter eksisterende databasekomponenter eller hele databaserne med alle deres data permanent. Der er andre SQL-kommandoer med en lignende effekt (TRUNCATE eller DELETE), men det særlige ved DROP-kommandoen er, at den sletter alt på én gang. For eksempel fjerner DROP TABLE tabeldata, indekserer, triggere, tilladelser, begrænsninger – hele tabellens skema.
DROP-sætningen kræver, at man er ekstremt forsigtig, når man bruger den. Når den er udført, kan den ikke rulles tilbage. Informationen går tabt for altid. Den eneste chance for at returnere dataene vil være at gendanne en sikkerhedskopi. Alligevel er vi i mange tilfælde nødt til at anvende DROP-udsagn. Denne artikel vil fokusere på sådanne tilfælde, de specifikke DROP-varianter og hvordan man bruger dem sikkert.
Forberedelser
For at undersøge vores sager har vi brug for en database med dataene. Jeg har oprettet en testdatabase ved navn EltechEmployees med følgende forespørgsel:
USE [master]
go
CREATE DATABASE [EltechEmployees]
go
I den database har jeg oprettet en tabel tblEmployees – følgende forespørgsel tjener til 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
Det næste trin er at oprette to ikke-klyngede indekser og et klynget indeks på tblEmployees tabel.
- Ikke-klyngede indekser:IDX_tblEmployees_loginID ogIDX_tblEmployees_nationalidnumber
- Ét klynget indeks:IDX _tblEmployees_gender
For at oprette disse indekser skal du bruge følgende forespørgsel:
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
Lad os se de indekser, vi oprettede:
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');
Output
Nu kan vi gå videre til de praktiske eksempler.
Drop indekserklæring
Vores første tilfælde er at droppe indeks fra en tabel.
Eksempel 1:Slip et eller flere indekser fra tabellen
Syntaksen til at droppe flere indekser er følgende:
Drop index
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName]
- Indeksnavn: Angiv det indeksnavn, du vil slette efter Drop Index-erklæringen .
- [Skemanavn].[Tabelnavn]: Angiv databasenavnet, skemanavnet og tabelnavnet. Drop table-sætningen giver dig mulighed for at bruge det todelte navn på ethvert databaseobjekt. Værdierne for [SchemaName].[TableName] skal angives efter søgeordet ON .
Antag, at vi ønsker at droppe IX_loginID_tblEmployees og IDX_nationalidnumber_tblEmployees på tblEmployees bord. For at gøre det skal du køre nedenstående forespørgsel:
DROP INDEX
[IDX_tblEmployees_loginID] ON [dbo].[tblEmployees],
[IDX_tblEmployees_nationalidnumber] ON [dbo].[tblEmployees]
Når indekser er slettet, skal du køre følgende forespørgsel for at se 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');
Output
Eksempel 2:Drop Index med MAXDOP og ONLINE Option.
Vi kan bruge MAXDOP og ONLINE muligheder, mens vi dropper indekset.
Bemærk :Vi kan kun droppe klyngede indeks ved at bruge MAXDOP og ONLINE muligheder.
Syntaksen er som følger:
DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
- Indeksnavn: Angiv det indeksnavn, du vil slette.
- [Skemanavn].[Tabelnavn]: Angiv det tredelte navn på tabellen.
- @MaxDop_val: Angiv værdien af MAXDOP-parameteren.
- @online_option: De gyldige værdier er TIL og FRA.
Antag, at vi vil slette PK_Employee_BusinessEntityID indeks med MAXDOP og ONLINE muligheder.
Slip indekset med værdien af MAXDOP-indstillingen til 5, og ONLINE-indstillingen er TIL. Forespørgslen for at slette indekset er følgende:
DROP INDEX [IDX_tblEmployees_gender] ON [dbo].[tblEmployees] WITH (maxdop=5,
online=ON)
Alle indekser er blevet slettet fra tblEmployees tabel.
SQL Drop Table Statement
DROP TABLE-sætningen sletter tabellen fra enhver database. Syntaksen for DROP TABLE er følgende:
DROP TABLE [DatabaseName].[SchemaName].[TableName]
[Databasenavn].[Skemanavn].[Tabelnavn]: Angiv tabelnavnet. Du kan bruge tabellens tredelte navn.
Tilladelser
Brugeren skal have ALTER tilladelse til skemaet, hvor tabellen er blevet oprettet, og Kontrol tilladelse på bordet, eller vær medlem af db_ddladmin fast rolle.
Bemærk:
- Hvis du slipper en tabel, der refereres til af en fremmednøgle, skal du først slippe den referencetabel.
- Når du sletter en tabel med en kolonne med FILESTREAM-attributten, slettes de data, der er gemt i filsystemet, ikke.
Eksempel 1:Slip en fysisk tabel
I det følgende eksempel dropper vi tabellen med navnet tblEmployees fra Eltech-medarbejderne database:
Drop table [EltechEmployees].[dbo].[tblEmployees]
Eksempel 2:Slip en midlertidig tabel
Her dropper vi et midlertidigt bord. Jeg har oprettet en vikartabel med navnet #tblEmployee ved at udføre følgende kode:
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
Før vi dropper tabellen, tjekker vi eksistensen af temp-tabellen. Hvis tabellen bliver fundet, vil den blive slettet.
IF Object_id(N'tempdb..#tblEmployees', N'U') IS NOT NULL
DROP TABLE #tblemployees;
go
Således er den midlertidige tabel #tblMedarbejdere vil blive droppet.
Drop databaseerklæring
Drop database-sætning virker til at droppe hele databasen. Syntaksen er følgende:
Drop database [DatabaseName]
[Databasenavn] :Angiv navnet på det databasenavn, du vil slette.
Tilladelser
For at slette databasen skal du bruge KONTROL eller ÆNDRE ENHVER DATABASE tilladelse til databasen. Eller du skal være medlem af db_owner fast databaserolle.
Bemærkninger :
- Når vi dropper en database i ONLINE tilstand, vil SQL-serveren slippe databasefilerne fra disken. Men hvis du dropper databasen i OFFLINE tilstand, taber SQL Server ikke databasefilerne. Vi skal slette dem manuelt.
- For at slette databasen, der er publiceret til transaktioner eller offentliggjort/abonneret på flettereplikeringen, skal vi ødelægge replikeringen og derefter slette databasen.
- Hvis brugere er forbundet til databasen, kan vi ikke droppe databasen. Først skal vi ændre dens tilstand til SINGLE_USER .
Eksempel:Slip den database, der bliver brugt
Vi ønsker at droppe Eltech-medarbejderne database. For at gøre det skal du køre følgende forespørgsel:
USE master
go
DROP DATABASE [EltechEmployees]
Hvis brugere er forbundet til databasen, vil du støde på følgende fejl:
Msg 3702, Level 16, State 4, Line 3
Cannot drop database "EltechEmployees" because it is currently in use.
For at rette fejlen skal vi udføre følgende forespørgsel:
USE [master]
go
ALTER DATABASE eltechemployees SET single_user WITH ROLLBACK immediate
Ovenstående forespørgsel sætter databasen i SINGLE_USER tilstand og sletter alle brugere, der er forbundet til databasen.
Lad os nu køre DROP DATABASE-sætningen:
USE master
go
DROP DATABASE [EltechEmployees]
Output
Som du kan se, blev kommandoen udført.
Oversigt
Vi har således undersøgt DROP INDEX, DROP TABLE og DROP DATABASE-sætningerne specifikke varianter af SQL DROP-sætningen. Håber, at de praktiske eksempler præsenteret i denne artikel hjalp med at forklare, hvordan og hvornår man anvender disse kommandoer.