La declaración SQL DROP es un comando que elimina los componentes de la base de datos existentes o las bases de datos completas con todos sus datos de forma permanente. Hay otros comandos SQL con un efecto similar (TRUNCATE o DELETE), pero la especificidad del comando DROP es que borra todo a la vez. Por ejemplo, DROP TABLE elimina los datos de la tabla, los índices, los activadores, los permisos, las restricciones:todo el esquema de la tabla.
La declaración DROP requiere que uno tenga mucho cuidado al usarla. Una vez realizado, no se puede revertir. La información se pierde para siempre. La única posibilidad de devolver los datos será restaurar una copia de seguridad. Aún así, en muchos casos, tenemos que aplicar sentencias DROP. Este artículo se centrará en tales casos, las variantes específicas de DROP y cómo usarlas de forma segura.
Preparativos
Para examinar nuestros casos, necesitaremos una base de datos con los datos. Creé una base de datos de prueba llamada EltechEmployees con la siguiente consulta:
USE [master]
go
CREATE DATABASE [EltechEmployees]
go
En esa base de datos, he creado una tabla tblEmployees – la siguiente consulta sirve para eso:
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
El siguiente paso es crear dos índices no agrupados y un índice agrupado en tblEmployees mesa.
- Índices no agrupados:IDX_tblEmployees_loginID y IDX_tblEmployees_nationalidnumber
- Un índice agrupado:IDX _tblEmployees_gender
Para crear estos índices, utilice la siguiente consulta:
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
Veamos los índices que creamos:
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');
Salida
Ahora podemos pasar a los ejemplos prácticos.
Declaración de índice de caída
Nuestro primer caso es quitar índices de una tabla.
Ejemplo 1:eliminar uno o varios índices de la tabla
La sintaxis para eliminar varios índices es la siguiente:
Drop index
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName]
- Nombre de índice: Especifique el nombre del índice que desea descartar después de la instrucción Eliminar índice .
- [Nombre del esquema].[Nombre de la tabla]: Especifique el nombre de la base de datos, el nombre del esquema y el nombre de la tabla. La instrucción Drop table le permite usar el nombre de dos partes de cualquier objeto de la base de datos. Los valores de [SchemaName].[TableName] debe especificarse después de la palabra clave ON .
Supongamos que queremos eliminar IX_loginID_tblEmployees y IDX_nationalidnumber_tblEmployees en tblEmpleados mesa. Para ello, ejecute la siguiente consulta:
DROP INDEX
[IDX_tblEmployees_loginID] ON [dbo].[tblEmployees],
[IDX_tblEmployees_nationalidnumber] ON [dbo].[tblEmployees]
Una vez que se eliminan los índices, ejecute la siguiente consulta para verlos:
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');
Salida
Ejemplo 2:Drop Index con MAXDOP y opción ONLINE.
Podemos usar las opciones MAXDOP y ONLINE mientras soltamos el índice.
Nota :Solo podemos eliminar el índice agrupado usando las opciones MAXDOP y ONLINE.
La sintaxis es la siguiente:
DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
- Nombre de índice: Especifique el nombre del índice que desea descartar.
- [NombreEsquema].[NombreTabla]: Especifique el nombre de tres partes de la tabla.
- @MaxDop_val: Especifique el valor del parámetro MAXDOP.
- @online_option: Los valores válidos son ON y OFF.
Supongamos que queremos eliminar el PK_Employee_BusinessEntityID índice con opciones MAXDOP y ONLINE.
Suelte el índice usando el valor de la opción MAXDOP a 5, y la opción EN LÍNEA está ACTIVADA. La consulta para eliminar el índice es la siguiente:
DROP INDEX [IDX_tblEmployees_gender] ON [dbo].[tblEmployees] WITH (maxdop=5,
online=ON)
Todos los índices se han eliminado de tblEmployees mesa.
Declaración de tabla desplegable de SQL
La instrucción DROP TABLE quita la tabla de cualquier base de datos. La sintaxis de DROP TABLE es la siguiente:
DROP TABLE [DatabaseName].[SchemaName].[TableName]
[Nombre de la base de datos].[Nombre del esquema].[Nombre de la tabla]: Especifique el nombre de la tabla. Puede usar el nombre de tres partes de la tabla.
Permisos
El usuario debe tener el ALTER permiso en el esquema donde se ha creado la tabla y el Control permiso en la tabla, o ser miembro de db_ddladmin rol fijo.
Nota:
- Si descarta una tabla a la que hace referencia una clave externa, primero debe descartar esa tabla de referencia.
- Cuando elimina una tabla con una columna que tiene el atributo FILESTREAM, los datos almacenados en el sistema de archivos no se eliminarán.
Ejemplo 1:colocar una tabla física
En el siguiente ejemplo, descartamos la tabla denominada tblEmployees de los Empleados de Eltech base de datos:
Drop table [EltechEmployees].[dbo].[tblEmployees]
Ejemplo 2:soltar una tabla temporal
Aquí, estamos lanzando una tabla temporal. He creado una tabla temporal llamada #tblEmployee ejecutando el siguiente código:
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
Antes de soltar la tabla, verificamos la existencia de la tabla temporal. Si se encuentra la tabla, se eliminará.
IF Object_id(N'tempdb..#tblEmployees', N'U') IS NOT NULL
DROP TABLE #tblemployees;
go
Por lo tanto, la tabla temporal #tblEmployees se eliminará.
Descartar declaración de base de datos
La declaración de eliminación de la base de datos funciona para eliminar toda la base de datos. La sintaxis es la siguiente:
Drop database [DatabaseName]
[Nombre de la base de datos] :especifique el nombre de la base de datos que desea descartar.
Permisos
Para eliminar la base de datos, necesita el CONTROL o ALTERAR CUALQUIER BASE DE DATOS permiso en la base de datos. O bien, debe ser miembro de db_owner función de base de datos fija.
Notas :
- Cuando soltamos cualquier base de datos en ONLINE estado, SQL Server eliminará los archivos de la base de datos del disco. Sin embargo, si está colocando la base de datos en OFFLINE estado, SQL Server no elimina los archivos de la base de datos. Debemos eliminarlos manualmente.
- Para descartar la base de datos publicada para transaccional o publicada/suscrita a la replicación de combinación, debemos destruir la replicación y luego descartar la base de datos.
- Si los usuarios están conectados a la base de datos, no podemos eliminar la base de datos. Primero, debemos cambiar su estado a SINGLE_USER .
Ejemplo:descartar la base de datos que se está utilizando
Queremos eliminar a los EltechEmployees base de datos. Para hacerlo, ejecute la siguiente consulta:
USE master
go
DROP DATABASE [EltechEmployees]
Si los usuarios están conectados a la base de datos, encontrará el siguiente error:
Msg 3702, Level 16, State 4, Line 3
Cannot drop database "EltechEmployees" because it is currently in use.
Para subsanar el error, debemos ejecutar la siguiente consulta:
USE [master]
go
ALTER DATABASE eltechemployees SET single_user WITH ROLLBACK immediate
La consulta anterior establece la base de datos en SINGLE_USER y elimina a todos los usuarios conectados a la base de datos.
Ahora, ejecutemos la sentencia DROP DATABASE:
USE master
go
DROP DATABASE [EltechEmployees]
Salida
Como puede ver, el comando se ejecutó con éxito.
Resumen
Por lo tanto, hemos examinado las variantes específicas de las sentencias DROP INDEX, DROP TABLE y DROP DATABASE de la sentencia SQL DROP. Espero que los ejemplos prácticos presentados en este artículo hayan ayudado a explicar cómo y cuándo aplicar estos comandos.