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

Istruzioni SQL DROP Index, DROP Table e DROP Database spiegate con esempi

L'istruzione SQL DROP è un comando che elimina i componenti del database esistenti o l'intero database con tutti i relativi dati in modo permanente. Esistono altri comandi SQL con un effetto simile (TRUNCATE o DELETE), ma la specificità del comando DROP è che elimina tutto in una volta. Ad esempio, DROP TABLE rimuove i dati della tabella, gli indici, i trigger, le autorizzazioni, i vincoli:l'intero schema della tabella.

L'istruzione DROP richiede di essere estremamente attenti quando la si utilizza. Una volta eseguito, non può essere ripristinato. Le informazioni sono perse per sempre. L'unica possibilità per restituire i dati sarà ripristinare un backup. Tuttavia, in molti casi, dobbiamo applicare le istruzioni DROP. Questo articolo si concentrerà su questi casi, sulle varianti DROP specifiche e su come utilizzarli in sicurezza.

Preparativi

Per esaminare i nostri casi, avremo bisogno di un database con i dati. Ho creato un database di test chiamato EltechEmployees con la seguente query:

USE [master] 
go 
CREATE DATABASE [EltechEmployees] 
go

In quel database ho creato una tabella tblEmployees – a tale scopo serve la seguente query:

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 

Il passaggio successivo consiste nella creazione di due indici non in cluster e un indice in cluster su tblEmployees tabella.

  • Indici non cluster:IDX_tblEmployees_loginID e IDX_tblEmployees_nationalidnumber
  • Un indice cluster:IDX _tblEmployees_gender

Per creare questi indici, utilizza la seguente query:

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

Vediamo gli indici che abbiamo creato:

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

Uscita

Ora possiamo passare agli esempi pratici.

Rendiconto dell'indice di caduta

Il nostro primo caso è eliminare gli indici da una tabella.

Esempio 1:elimina uno o più indici dalla tabella

La sintassi per eliminare più indici è la seguente:

Drop index 
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName] 
  • NomeIndice: Specifica il nome dell'indice che desideri eliminare dopo l'istruzione Drop Index .
  • [Nome Schema].[NomeTabella]: Specificare il nome del database, il nome dello schema e il nome della tabella. L'istruzione Drop table consente di utilizzare il nome in due parti di qualsiasi oggetto di database. I valori di [SchemaName].[TableName] deve essere specificato dopo la parola chiave ON .

Supponiamo di voler eliminare IX_loginID_tblEmployees e IDX_nationalidnumber_tblEmployees sui tblEmployees tavolo. Per farlo, esegui la query seguente:

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

Una volta eliminati gli indici, esegui la seguente query per visualizzarli:

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

Uscita

Esempio 2:Drop Index con MAXDOP e opzione ONLINE.

Possiamo usare le opzioni MAXDOP e ONLINE mentre eliminiamo l'indice.

Nota :Possiamo eliminare solo l'indice cluster utilizzando le opzioni MAXDOP e ONLINE.

La sintassi è la seguente:

DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
  • Nome indice: Specifica il nome dell'indice che desideri eliminare.
  • [Nome Schema].[NomeTabella]: Specifica il nome in tre parti della tabella.
  • @MaxDop_val: Specificare il valore del parametro MAXDOP.
  • @opzione_online: I valori validi sono ON e OFF.

Supponiamo di voler eliminare il PK_Employee_BusinessEntityID indice con MAXDOP e opzioni ONLINE.

Rilascia l'indice utilizzando il valore dell'opzione MAXDOP su 5 e l'opzione ONLINE è ATTIVA. La query per eliminare l'indice è la seguente:

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

Tutti gli indici sono stati eliminati da tblEmployees tabella.

Istruzione SQL Drop Table

L'istruzione DROP TABLE elimina la tabella da qualsiasi database. La sintassi della DROP TABLE è la seguente:

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

[Nome Database].[Nome Schema].[NomeTabella]: Specificare il nome della tabella. Puoi usare il nome in tre parti della tabella.

Autorizzazioni

L'utente deve disporre di ALTER autorizzazione sullo schema in cui è stata creata la tabella e il Control permesso sul tavolo o essere un membro di db_ddladmin ruolo fisso.

Nota:

  1. Se elimini una tabella referenziata da una chiave esterna, devi prima eliminare quella tabella di riferimento.
  2. Quando si elimina una tabella con una colonna con l'attributo FILESTREAM, i dati archiviati nel file system non verranno eliminati.

Esempio 1:elimina una tabella fisica

Nell'esempio seguente, stiamo eliminando la tabella denominata tblEmployees dagli EltechEmployees banca dati:

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

Esempio 2:elimina una tabella temporanea

Qui stiamo eliminando una tabella temporanea. Ho creato una tabella temporanea denominata #tblEmployee eseguendo il seguente codice:

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

Prima di eliminare la tabella, controlliamo l'esistenza della tabella temporanea. Se la tabella viene trovata, verrà eliminata.

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

Pertanto, la tabella temporanea #tblEmployees verrà eliminato.

Rendiconto Drop Database

L'istruzione Drop database funziona per eliminare l'intero database. La sintassi è la seguente:

Drop database [DatabaseName]

[Nome database] :Specifica il nome del database che desideri eliminare.

Autorizzazioni

Per eliminare il database, è necessario il CONTROL o ALTER QUALSIASI DATABASE autorizzazione sul database. In alternativa, devi essere un membro di db_owner ruolo database fisso.

Note :

  1. Quando eliminiamo qualsiasi database in ONLINE stato, SQL Server eliminerà i file di database dal disco. Tuttavia, se stai eliminando il database in OFFLINE stato, SQL Server non elimina i file di database. Dobbiamo eliminarli manualmente.
  2. Per eliminare il database pubblicato per transazionale o pubblicato/sottoscritto alla replica di tipo merge, dobbiamo distruggere la replica e quindi eliminare il database.
  3. Se gli utenti sono connessi al database, non possiamo eliminare il database. Innanzitutto, dobbiamo cambiarne lo stato in SINGLE_USER .

Esempio:elimina il database in uso

Vogliamo eliminare gli EltechEmployees Banca dati. Per farlo, esegui la seguente query:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Se gli utenti sono connessi al database, riscontrerai il seguente errore:

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

Per correggere l'errore, dobbiamo eseguire la seguente query:

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

La query precedente imposta il database in SINGLE_USER modalità e rimuove tutti gli utenti connessi al database.

Ora, eseguiamo l'istruzione DROP DATABASE:

USE master 
go 
DROP DATABASE [EltechEmployees] 

Uscita

Come puoi vedere, il comando è stato eseguito correttamente.

Riepilogo

Pertanto, abbiamo esaminato le varianti specifiche delle istruzioni DROP INDEX, DROP TABLE e DROP DATABASE dell'istruzione SQL DROP. Spero che gli esempi pratici presentati in questo articolo abbiano aiutato a spiegare come e quando applicare questi comandi.