Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Entendendo a instrução DROP TABLE no SQL Server


A instrução DROP TABLE do SQL Server serve para eliminar a tabela do banco de dados. Este artigo explicará alguns cenários de uso e ilustrará o trabalho da instrução DROP TABLE por meio de exemplos.

Para demonstração, estamos usando os wideworldimportors banco de dados de demonstração - você pode baixá-lo aqui.

A sintaxe da instrução DROP TABLE é a seguinte:
Drop table [Database_name].[Schema_name].[table_name]
  • Database_name : o nome do banco de dados do qual você deseja excluir a tabela no SQL.
  • Schema_Name : o nome do esquema para o qual a tabela existe. Se você criou a tabela no esquema DBO, podemos pular esse parâmetro. Se a tabela for criada em um esquema não padrão, devemos especificar o nome do nome do esquema.
  • Nome_tabela : o nome da tabela em SQL ou MySQL que você deseja excluir.

Quando descartamos uma tabela, o SQL Server executa as seguintes ações:
  1. Elimina a tabela com dados.
  2. Elimina as estatísticas da tabela.
  3. Elimina índices, restrições e chave primária associados a essa tabela. Se tivermos os relacionamentos de chave estrangeira, devemos eliminar a tabela filha.

Antes de descartar a tabela, devemos cuidar das seguintes coisas.
  1. Certifique-se de que os procedimentos armazenados, gatilhos e exibições que dependem dessa tabela sejam alterados ou modificados. Você pode encontrar os objetos de banco de dados necessários usando o sp_depends procedimento armazenado.
  2. Sempre use [database_name].[schema_name].[table_name] format para descartar a tabela correta.
  3. Lembre-se de que é impossível recuperar a tabela específica do backup do SQL Server. Se você deseja recuperar uma tabela específica, deve comprar ferramentas de terceiros. Se você acha que a tabela pode exigir referências ou relatórios personalizados, certifique-se de gerar um backup da tabela criando outra cópia.

Configuração de demonstração


Na demonstração Wideworldimportors banco de dados, existem tabelas chamadas tblBusinessEntity , tblCountryRegion, tblCity, e tblCliente .
  • As tabelas tblBusinessEntity e tblCliente estão no esquema padrão, enquanto tblCountryRegion e tblCity estão no País esquema.
  • A tblCity é uma tabela temporal com versão do sistema.
  • A restrição de chave estrangeira está entre tblBusinessEntity e tblCliente mesas. O BusinessEntityID coluna de tblCustomer referências a BusinessEntityID coluna (Chave Primária) da tblBusinessEntity tabela.

Inseri dados do AdventureWorks2017 banco de dados com a ajuda da instrução INSERT INTO SELECT * FROM.

Os scripts T-SQL para preparar a configuração de demonstração são os seguintes:
Use WideworldImportors
go
CREATE SCHEMA [country]
Go

Crie as tabelas:
Use WideworldImportors
go
CREATE TABLE [tblBusinessEntity](
	[BusinessEntityID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[ModifiedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_BusinessEntity_BusinessEntityID] PRIMARY KEY CLUSTERED 
([BusinessEntityID] ASC))
GO

CREATE TABLE [Country].[tblCountryRegion](
	[CountryRegionCode] [nvarchar](3) NOT NULL,
	[Name] varchar(500) NOT NULL
 CONSTRAINT [Country].[PK_CountryRegion_CountryRegionCode] PRIMARY KEY CLUSTERED 
([CountryRegionCode] ASC))
GO
CREATE TABLE [tblCustomer](
	[BusinessEntityID] [int] NOT NULL,
	[PersonType] [nchar](2) NOT NULL,
	[NameStyle] varchar(15) NOT NULL,
	[Title] [nvarchar](8) NULL,
	[FirstName] varchar(150) NOT NULL,
	[MiddleName] varchar(150) NULL,
	[LastName] varchar(150) NOT NULL,
	[Suffix] [nvarchar](10) NULL,
	[EmailPromotion] [int] NOT NULL,
	[ModifiedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_Person_BusinessEntityID] PRIMARY KEY CLUSTERED 
([BusinessEntityID] ASC))
GO
CREATE TABLE [Country].[tblCity](
	[CityID] [int] NOT NULL,
	[CityName] [nvarchar](50) NOT NULL,
	[StateProvinceID] [int] NOT NULL,
	[LatestRecordedPopulation] [bigint] NULL,
	[LastEditedBy] [int] NOT NULL,
	[ValidFrom] [datetime2](7) GENERATED ALWAYS AS ROW START NOT NULL,
	[ValidTo] [datetime2](7) GENERATED ALWAYS AS ROW END NOT NULL,
 CONSTRAINT [PK_Country_Cities] PRIMARY KEY CLUSTERED 
(
	[CityID] ASC
),
	PERIOD FOR SYSTEM_TIME ([ValidFrom], [ValidTo])
) ON [USERDATA] TEXTIMAGE_ON [USERDATA]
WITH
(
SYSTEM_VERSIONING = ON ( HISTORY_TABLE = [Country].[City_Archive] )
)
GO

Crie o índice de chave estrangeira:
Use WideworldImportors
go
ALTER TABLE [tblCustomer]  WITH CHECK ADD  CONSTRAINT [FK_Person_BusinessEntity_BusinessEntityID] FOREIGN KEY([BusinessEntityID])
REFERENCES [tblBusinessEntity] ([BusinessEntityID])
GO

Insira os dados nas tabelas:
Use WideworldImportors
Go
set identity_insert tblBusinessEntity on
Go
insert into tblBusinessEntity ([BusinessEntityID],[ModifiedDate])
select [BusinessEntityID],[ModifiedDate] from [AdventureWorks2017].[Person].[BusinessEntity]
Go
set identity_insert tblBusinessEntity off
Go
insert into tblCustomer ([BusinessEntityID],[PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[EmailPromotion],[ModifiedDate])
select [BusinessEntityID],[PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[EmailPromotion],[ModifiedDate] 
from AdventureWorks2017.Person.Person
Go
insert into [Country].[tblCountryRegion]([CountryRegionCode],[Name]) 
select  [CountryRegionCode],[Name] from [AdventureWorks2017].[Person].[CountryRegion]
Go

Uma vez executados os scripts, podemos verificar se os objetos foram criados corretamente e se os dados foram inseridos nas tabelas.

Confira as tabelas:
Use WideWorldImporters
Go
select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('tblCustomer','tblCountryRegion','tblBusinessEntity')
Go

Saída:

Obtenha a contagem de linhas nas tabelas:
Use WideWorldImporters
Go
select object_name(object_id) as [Table Name], rows [Total Rows] from sys.partitions 
where object_id in (object_id('tblCustomer'),object_id('country.tblCountryRegion'),object_id('tblBusinessEntity'))
Go

Saída:

Agora, vamos explorar o uso do DROP TABLE por exemplos.

Exemplo 1:aplicação simples da instrução DROP TABLE


Às vezes, ao trabalhar com uma tabela, pode ocorrer um erro. Isso acontece quando um usuário tenta DROP uma tabela que não existe. Existe uma maneira simples de evitar isso – usando o comando SQL DROP TABLE IF EXISTS.

A sintaxe é a seguinte:
-- use database
USE [MyDatabase];
GO

-- attempt to run DROP TABLE only if it exists 
DROP TABLE IF EXISTS [dbo].[MyTable0];
GO

Não há necessidade de verificar manualmente se a tabela que você deseja eliminar já existe porque o comando DROP TABLE IF EXITS no SQL fará isso por você.

Você pode usar o SQL Server Management Studio (SSMS) se precisar DROP todas as tabelas.

Suponha que queremos eliminar o tblCountryRegion tabela do nosso banco de dados. Para isso, execute a seguinte consulta:
use WideWorldImporters
Go
drop table tblCountryRegion

Recebemos o erro:
Msg 3701, Level 11, State 5, Line 3
Cannot drop the table 'tblCountryRegion' because it does not exist 
or you do not have permission.

Como mencionado anteriormente, para descartar a tabela criada no esquema não padrão, devemos escrever a instrução DROP TABLE no [schema_name].[table_name] formato .

Execute a seguinte consulta:
use WideWorldImporters
Go
drop table [country].[tblCountryRegion]

Saída:
Commands completed successfully.

Soltamos a tabela com sucesso.

Exemplo 2:elimine uma tabela que tenha uma chave estrangeira


Deixemos de lado o tblBusinessEntity do banco de dados – execute a seguinte consulta:
use WideWorldImporters
Go
Drop table tblBusinessEntity

Ele retorna o erro:
Msg 3726, Level 16, State 1, Line 3
Could not drop object 'tblBusinessEntity' because it is referenced 
by a FOREIGN KEY constraint.

Quando eliminamos uma tabela com uma chave estrangeira que faz referência à chave primária da tabela pai, devemos eliminar a tabela pai e, em seguida, podemos eliminar a tabela filho.

No nosso caso, para descartar o tblBusinessEntity tabela, devemos eliminar o tblCustomer tabela. Execute a seguinte consulta:
use WideWorldImporters
Go
Drop table tblcustomer

Assim, a tabela foi descartada com sucesso.

Depois de descartar tblcustomer , execute a seguinte instrução para eliminar o tblBusinessEntity tabela:
use WideWorldImporters
Go
Drop table tblBusinessEntity

Saída:

A tabela foi removida com sucesso.

Exemplo 3:remover uma tabela temporal


As tabelas temporais com versão do sistema apareceram pela primeira vez no SQL Server 2016. Essas tabelas podem recuperar dados excluídos e atualizados, pois a tabela de histórico rastreia as alterações que ocorreram na tabela temporal. Consulte Introdução às tabelas temporais com versão do sistema para obter mais informações sobre o conceito de tabelas temporais.

A eliminação de tabelas temporais é diferente do processo de eliminação de uma tabela normal. Devemos realizar os seguintes passos:
  1. Desative o SYSTEM_VERSIONING.
  2. Retire a tabela temporal.
  3. Retire a tabela de histórico.

Vamos examinar o processo – retire o [País].[Cidade] tabela.

Etapa 1:execute o script a seguir para desativar o SYSTEM_VERSIONING:
Alter table [Country].[tblCity] set ( SYSTEM_VERSIONING = OFF  )

Etapa 2:remova o [País].[Cidade] table executando a seguinte instrução DROP TABLE:
drop table [Country].[tblCity]

Etapa 3:descarte o [Country].[City_Archive] tabela executando a seguinte consulta:
drop table [Country].[City_Archive]

Etapa 4:verifique se a tabela foi descartada executando a seguinte consulta:
Use WideWorldImporters
Go
select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME in ('tblCity')

Saída:

Como você pode ver, a tabela foi descartada.

Resumo


A instrução DROP TABLE é necessária quando precisamos remover definitivamente certas tabelas do banco de dados. No entanto, o uso desta declaração tem suas peculiaridades. Exploramos vários casos de uso padrão e possíveis problemas que ocorrem durante as tarefas.

Também aprendemos como aplicar a instrução DROP TABLE para eliminar uma única tabela, uma tabela com uma chave estrangeira e a tabela temporal com versão do sistema. Espero que este artigo seja útil.

Leia também


Instrução SQL DROP TABLE e vários casos de uso