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:
- Se elimini una tabella referenziata da una chiave esterna, devi prima eliminare quella tabella di riferimento.
- 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 :
- 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.
- Per eliminare il database pubblicato per transazionale o pubblicato/sottoscritto alla replica di tipo merge, dobbiamo distruggere la replica e quindi eliminare il database.
- 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.