Database
 sql >> Base de Dados >  >> RDS >> Database

SQL DROP Index, DROP Table e Instruções de banco de dados DROP explicadas com exemplos


A instrução SQL DROP é um comando que exclui componentes de banco de dados existentes ou bancos de dados inteiros com todos os seus dados permanentemente. Existem outros comandos SQL com efeito semelhante (TRUNCATE ou DELETE), mas a especificidade do comando DROP é que ele apaga tudo de uma vez. Por exemplo, DROP TABLE remove os dados da tabela, índices, gatilhos, permissões, restrições – todo o esquema da tabela.

A instrução DROP exige que se seja extremamente cuidadoso ao usá-la. Uma vez executado, não pode ser revertido. A informação está perdida para sempre. A única chance de retornar os dados será restaurar um backup. Ainda assim, em muitos casos, temos que aplicar instruções DROP. Este artigo se concentrará em tais casos, nas variantes DROP específicas e em como usá-las com segurança.

Preparações


Para examinar nossos casos, precisaremos de um banco de dados com os dados. Eu criei um banco de dados de teste chamado EltechEmployees com a seguinte consulta:
USE [master] 
go 
CREATE DATABASE [EltechEmployees] 
go

Nesse banco de dados, criei uma tabela tblEmployees – a seguinte consulta serve para isso:
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 

A próxima etapa é criar dois índices não clusterizados e um índice clusterizado no tblEmployees tabela.
  • Índices não agrupados:IDX_tblEmployees_loginID e IDX_tblEmployees_nationalidnumber
  • Um índice clusterizado:IDX _tblEmployees_gender

Para criar esses índices, use a seguinte 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

Vamos ver os índices que criamos:
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');

Saída

Agora podemos prosseguir para os exemplos práticos.

Declaração de índice de queda


Nosso primeiro caso é descartar índices de uma tabela.

Exemplo 1:descarte um ou vários índices da tabela


A sintaxe para descartar vários índices é a seguinte:
Drop index 
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName] 
  • IndexName: Especifique o nome do índice que você deseja descartar após a instrução Drop Index .
  • [SchemaName].[TableName]: Especifique o nome do banco de dados, o nome do esquema e o nome da tabela. A instrução Drop table permite que você use o nome de duas partes de qualquer objeto de banco de dados. Os valores de [SchemaName].[TableName] deve ser especificado após a palavra-chave ON .

Suponha que queremos eliminar IX_loginID_tblEmployees e IDX_nationalidnumber_tblEmployees nos tblEmployees tabela. Para isso, execute a consulta abaixo:
DROP INDEX 
[IDX_tblEmployees_loginID] ON [dbo].[tblEmployees], 
[IDX_tblEmployees_nationalidnumber] ON [dbo].[tblEmployees] 

Depois que os índices forem descartados, execute a seguinte consulta para visualizá-los:
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'); 

Saída

Exemplo 2:Índice de queda com MAXDOP e opção ONLINE.


Podemos usar as opções MAXDOP e ONLINE enquanto descartamos o índice.

Observação :Podemos descartar apenas o índice clusterizado usando as opções MAXDOP e ONLINE.

A sintaxe é a seguinte:
DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
  • Nome do índice: Especifique o nome do índice que você deseja eliminar.
  • [SchemaName].[TableName]: Especifique o nome de três partes da tabela.
  • @MaxDop_val: Especifique o valor do parâmetro MAXDOP.
  • @online_option: Os valores válidos são ON e OFF.

Suponha que queremos eliminar o PK_Employee_BusinessEntityID index com opções MAXDOP e ONLINE.

Elimine o índice usando o valor da opção MAXDOP para 5, e a opção ONLINE fica ON. A consulta para descartar o índice é a seguinte:
DROP INDEX [IDX_tblEmployees_gender] ON [dbo].[tblEmployees] WITH (maxdop=5, 
online=ON)

Todos os índices foram removidos dos tblEmployees tabela.

Instrução SQL Drop Table


A instrução DROP TABLE elimina a tabela de qualquer banco de dados. A sintaxe do DROP TABLE é a seguinte:
DROP TABLE [DatabaseName].[SchemaName].[TableName]

[DatabaseName].[SchemaName].[TableName]: Especifique o nome da tabela. Você pode usar o nome de três partes da tabela.

Permissões

O usuário deve ter o ALTER permissão no esquema em que a tabela foi criada e o Control permissão na tabela ou seja um membro do db_ddladmin papel fixo.

Observação:
  1. Se você descartar uma tabela referenciada por uma chave estrangeira, deverá descartar essa tabela de referência primeiro.
  2. Ao eliminar uma tabela com uma coluna com o atributo FILESTREAM, os dados armazenados no sistema de arquivos não serão eliminados.

Exemplo 1:descartar uma tabela física


No exemplo a seguir, estamos descartando a tabela chamada tblEmployees dos EltechEmployees base de dados:
Drop table [EltechEmployees].[dbo].[tblEmployees]

Exemplo 2:descartar uma tabela temporária


Aqui, estamos descartando uma tabela temporária. Eu criei uma tabela temporária chamada #tblEmployee executando o seguinte 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 descartar a tabela, verificamos a existência da tabela temporária. Se a tabela for encontrada, ela será descartada.
IF Object_id(N'tempdb..#tblEmployees', N'U') IS NOT NULL 
  DROP TABLE #tblemployees; 
go 

Assim, a tabela temporária #tblEmployees será descartado.

Declaração de banco de dados de descarte


A instrução Drop database funciona para descartar todo o banco de dados. A sintaxe é a seguinte:
Drop database [DatabaseName]

[DatabaseName] :Especifique o nome do banco de dados que você deseja eliminar.

Permissões

Para descartar o banco de dados, você precisa do CONTROL ou ALTERAR QUALQUER BANCO DE DADOS permissão no banco de dados. Ou você deve ser um membro do db_owner função de banco de dados fixa.

Observações :
  1. Quando descartamos qualquer banco de dados no ONLINE estado, o SQL Server irá descartar os arquivos de banco de dados do disco. No entanto, se você estiver descartando o banco de dados no OFFLINE estado, o SQL Server não descarta os arquivos de banco de dados. Devemos excluí-los manualmente.
  2. Para descartar o banco de dados publicado para transacional ou publicado/assinado para a replicação de mesclagem, devemos destruir a replicação e, em seguida, descartar o banco de dados.
  3. Se os usuários estiverem conectados ao banco de dados, não podemos descartar o banco de dados. Primeiro, devemos alterar seu estado para SINGLE_USER .

Exemplo:descarte o banco de dados que está sendo usado


Queremos eliminar os EltechEmployees base de dados. Para fazer isso, execute a seguinte consulta:
USE master 
go 
DROP DATABASE [EltechEmployees] 

Se os usuários estiverem conectados ao banco de dados, você encontrará o seguinte erro:
Msg 3702, Level 16, State 4, Line 3
Cannot drop database "EltechEmployees" because it is currently in use.

Para corrigir o erro, devemos executar a seguinte consulta:
USE [master] 
go 
ALTER DATABASE eltechemployees SET single_user WITH ROLLBACK immediate 

A consulta acima define o banco de dados no SINGLE_USER mode e descarta todos os usuários conectados ao banco de dados.

Agora, vamos executar a instrução DROP DATABASE:
USE master 
go 
DROP DATABASE [EltechEmployees] 

Saída

Como você pode ver, o comando foi executado com sucesso.

Resumo


Assim, examinamos as variantes específicas das instruções DROP INDEX, DROP TABLE e DROP DATABASE da instrução SQL DROP. Espero que os exemplos práticos apresentados neste artigo ajudem a explicar como e quando aplicar esses comandos.