Database
 sql >> Datenbank >  >> RDS >> Database

SQL DROP-Index-, DROP-Tabellen- und DROP-Datenbankanweisungen mit Beispielen erklärt

Die SQL DROP-Anweisung ist ein Befehl, der bestehende Datenbankkomponenten oder die gesamten Datenbanken mit all ihren Daten dauerhaft löscht. Es gibt andere SQL-Befehle mit ähnlicher Wirkung (TRUNCATE oder DELETE), aber die Besonderheit des DROP-Befehls besteht darin, dass er alles auf einmal löscht. Beispielsweise entfernt DROP TABLE die Tabellendaten, Indizes, Trigger, Berechtigungen, Einschränkungen – das gesamte Schema der Tabelle.

Die DROP-Anweisung erfordert äußerste Vorsicht bei der Verwendung. Einmal ausgeführt, kann es nicht mehr rückgängig gemacht werden. Die Informationen gehen endgültig verloren. Die einzige Möglichkeit, die Daten zurückzugeben, besteht darin, ein Backup wiederherzustellen. Dennoch müssen wir in vielen Fällen DROP-Anweisungen anwenden. Dieser Artikel konzentriert sich auf solche Fälle, die spezifischen DROP-Varianten und wie man sie sicher verwendet.

Vorbereitungen

Um unsere Fälle zu untersuchen, benötigen wir eine Datenbank mit den Daten. Ich habe eine Testdatenbank namens EltechEmployees erstellt mit der folgenden Abfrage:

USE [master] 
go 
CREATE DATABASE [EltechEmployees] 
go

In dieser Datenbank habe ich eine Tabelle tblEmployees erstellt – Dazu dient folgende Abfrage:

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 

Der nächste Schritt besteht darin, zwei nicht gruppierte Indizes und einen gruppierten Index für tblEmployees zu erstellen Tabelle.

  • Nicht gruppierte Indizes:IDX_tblEmployees_loginID undIDX_tblEmployees_nationalidnumber
  • Ein gruppierter Index:IDX _tblEmployees_gender

Um diese Indizes zu erstellen, verwenden Sie die folgende Abfrage:

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

Sehen wir uns die von uns erstellten Indizes an:

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');

Ausgabe

Jetzt können wir zu den praktischen Beispielen übergehen.

Drop-Index-Erklärung

Unser erster Fall ist das Löschen von Indizes aus einer Tabelle.

Beispiel 1:Löschen Sie einen oder mehrere Indizes aus der Tabelle

Die Syntax zum Löschen mehrerer Indizes lautet wie folgt:

Drop index 
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName] 
  • Indexname: Geben Sie den Indexnamen an, den Sie nach der Drop-Index-Anweisung löschen möchten .
  • [Schemaname].[Tabellenname]: Geben Sie den Datenbanknamen, den Schemanamen und den Tabellennamen an. Mit der Anweisung Drop table können Sie den zweiteiligen Namen eines beliebigen Datenbankobjekts verwenden. Die Werte von [SchemaName].[TableName] muss nach dem Schlüsselwort ON angegeben werden .

Angenommen, wir möchten IX_loginID_tblEmployees löschen und IDX_nationalidnumber_tblEmployees auf den tblEmployees Tisch. Führen Sie dazu die folgende Abfrage aus:

DROP INDEX 
[IDX_tblEmployees_loginID] ON [dbo].[tblEmployees], 
[IDX_tblEmployees_nationalidnumber] ON [dbo].[tblEmployees] 

Führen Sie nach dem Löschen der Indizes die folgende Abfrage aus, um sie anzuzeigen:

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'); 

Ausgabe

Beispiel 2:Index löschen mit MAXDOP und ONLINE-Option.

Wir können MAXDOP- und ONLINE-Optionen verwenden, während wir den Index löschen.

Hinweis :Wir können nur geclusterte Indizes mit MAXDOP- und ONLINE-Optionen löschen.

Die Syntax lautet wie folgt:

DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
  • Indexname: Geben Sie den Indexnamen an, den Sie löschen möchten.
  • [Schemaname].[Tabellenname]: Geben Sie den dreiteiligen Namen der Tabelle an.
  • @MaxDop_val: Geben Sie den Wert des MAXDOP-Parameters an.
  • @online_option: Die gültigen Werte sind ON und OFF.

Angenommen, wir möchten die PK_Employee_BusinessEntityID löschen Index mit MAXDOP- und ONLINE-Optionen.

Löschen Sie den Index mit dem Wert der Option MAXDOP auf 5, und die Option ONLINE ist EIN. Die Abfrage zum Löschen des Index lautet wie folgt:

DROP INDEX [IDX_tblEmployees_gender] ON [dbo].[tblEmployees] WITH (maxdop=5, 
online=ON)

Alle Indizes wurden aus den tblEmployees entfernt Tabelle.

SQL Drop Table-Anweisung

Die DROP TABLE-Anweisung löscht die Tabelle aus jeder Datenbank. Die Syntax der DROP TABLE lautet wie folgt:

DROP TABLE [DatabaseName].[SchemaName].[TableName]

[Datenbankname].[Schemaname].[Tabellenname]: Geben Sie den Tabellennamen an. Sie können den dreiteiligen Namen der Tabelle verwenden.

Berechtigungen

Der Benutzer muss das ALTER haben Berechtigung für das Schema, in dem die Tabelle erstellt wurde, und das Control Berechtigung für die Tabelle oder ein Mitglied von db_ddladmin sein feste Rolle.

Hinweis:

  1. Wenn Sie eine Tabelle löschen, auf die von einem Fremdschlüssel verwiesen wird, müssen Sie diese referenzierende Tabelle zuerst löschen.
  2. Wenn Sie eine Tabelle mit einer Spalte mit dem FILESTREAM-Attribut löschen, werden die im Dateisystem gespeicherten Daten nicht gelöscht.

Beispiel 1:Löschen einer physischen Tabelle

Im folgenden Beispiel löschen wir die Tabelle mit dem Namen tblEmployees von den EltechMitarbeitern Datenbank:

Drop table [EltechEmployees].[dbo].[tblEmployees]

Beispiel 2:Löschen einer temporären Tabelle

Hier löschen wir eine temporäre Tabelle. Ich habe eine temporäre Tabelle namens #tblEmployee erstellt durch Ausführen des folgenden Codes:

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

Bevor wir die Tabelle löschen, überprüfen wir die Existenz der temporären Tabelle. Wenn die Tabelle gefunden wird, wird sie gelöscht.

IF Object_id(N'tempdb..#tblEmployees', N'U') IS NOT NULL 
  DROP TABLE #tblemployees; 
go 

Daher die temporäre Tabelle #tblEmployees wird gelöscht.

Anweisung zum Löschen der Datenbank

Die Anweisung zum Löschen der Datenbank funktioniert, um die gesamte Datenbank zu löschen. Die Syntax lautet wie folgt:

Drop database [DatabaseName]

[Datenbankname] :Geben Sie den Namen der Datenbank an, die Sie löschen möchten.

Berechtigungen

Um die Datenbank zu löschen, benötigen Sie das CONTROL oder JEDE DATENBANK ÄNDERN Berechtigung für die Datenbank. Oder Sie müssen Mitglied von db_owner sein feste Datenbankrolle.

Notizen :

  1. Wenn wir eine Datenbank ONLINE löschen Status, löscht der SQL Server die Datenbankdateien von der Festplatte. Wenn Sie die Datenbank jedoch im OFFLINE-Modus ablegen Status, löscht der SQL Server die Datenbankdateien nicht. Wir müssen sie manuell löschen.
  2. Um die für Transaktionszwecke veröffentlichte oder für die Mergereplikation veröffentlichte/abonnierte Datenbank zu löschen, müssen wir die Replikation zerstören und dann die Datenbank löschen.
  3. Wenn Benutzer mit der Datenbank verbunden sind, können wir die Datenbank nicht löschen. Zuerst müssen wir seinen Status auf SINGLE_USER ändern .

Beispiel:Verwendete Datenbank löschen

Wir wollen die EltechMitarbeiter fallen lassen Datenbank. Führen Sie dazu die folgende Abfrage aus:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Wenn Benutzer mit der Datenbank verbunden sind, wird der folgende Fehler angezeigt:

Msg 3702, Level 16, State 4, Line 3
Cannot drop database "EltechEmployees" because it is currently in use.

Um den Fehler zu beheben, müssen wir folgende Abfrage ausführen:

USE [master] 
go 
ALTER DATABASE eltechemployees SET single_user WITH ROLLBACK immediate 

Die obige Abfrage legt die Datenbank im SINGLE_USER fest Modus und löscht alle mit der Datenbank verbundenen Benutzer.

Lassen Sie uns nun die DROP DATABASE-Anweisung ausführen:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Ausgabe

Wie Sie sehen können, wurde der Befehl erfolgreich ausgeführt.

Zusammenfassung

Daher haben wir die DROP INDEX-, DROP TABLE- und DROP DATABASE-Anweisungen untersucht, die spezifische Varianten der SQL DROP-Anweisung sind. Ich hoffe, dass die in diesem Artikel vorgestellten praktischen Beispiele dazu beigetragen haben, zu erklären, wie und wann diese Befehle anzuwenden sind.