Instrukcja SQL DROP to polecenie, które trwale usuwa istniejące komponenty bazy danych lub całe bazy danych ze wszystkimi ich danymi. Istnieją inne polecenia SQL o podobnym działaniu (TRUNCATE lub DELETE), ale specyfika polecenia DROP polega na tym, że usuwa wszystko na raz. Na przykład DROP TABLE usuwa dane z tabeli, indeksy, wyzwalacze, uprawnienia, ograniczenia – cały schemat tabeli.
Instrukcja DROP wymaga od nas szczególnej ostrożności podczas korzystania z niej. Po wykonaniu nie można go cofnąć. Informacje giną na dobre. Jedyną szansą na zwrócenie danych będzie przywrócenie kopii zapasowej. Mimo to w wielu przypadkach musimy zastosować instrukcje DROP. W tym artykule skupimy się na takich przypadkach, konkretnych wariantach DROP i jak ich bezpiecznie używać.
Przygotowania
Aby zbadać nasze przypadki, potrzebujemy bazy danych z danymi. Utworzyłem testową bazę danych o nazwie EltechEmployees z następującym zapytaniem:
USE [master]
go
CREATE DATABASE [EltechEmployees]
go
W tej bazie danych utworzyłem tabelę tblEmployees – służy do tego następujące zapytanie:
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
Następnym krokiem jest utworzenie dwóch indeksów nieklastrowych i jednego indeksu klastrowego w tblEmployees tabela.
- Indeksy nieklastrowe:IDX_tblEmployees_loginID orazIDX_tblEmployees_nationalidnumber
- Jeden indeks klastrowy:IDX _tblEmployees_gender
Aby utworzyć te indeksy, użyj następującego zapytania:
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
Zobaczmy utworzone przez nas indeksy:
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');
Wyjście
Teraz możemy przejść do praktycznych przykładów.
Oświadczenie o odrzuceniu indeksu
Naszym pierwszym przypadkiem jest usuwanie indeksów z tabeli.
Przykład 1:Usuń jeden lub wiele indeksów z tabeli
Składnia usuwania wielu indeksów jest następująca:
Drop index
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName]
- Nazwa indeksu: Określ nazwę indeksu, który chcesz usunąć po oświadczeniu Indeks odrzucenia .
- [SchemaName].[TableName]: Określ nazwę bazy danych, nazwę schematu i nazwę tabeli. Instrukcja Drop table umożliwia użycie dwuczęściowej nazwy dowolnego obiektu bazy danych. Wartości [SchemaName].[TableName] należy określić po słowie kluczowym ON .
Załóżmy, że chcemy porzucić IX_loginID_tblEmployees i IDX_nationalidnumber_tblEmployees na tabeliEmployees stół. Aby to zrobić, uruchom poniższe zapytanie:
DROP INDEX
[IDX_tblEmployees_loginID] ON [dbo].[tblEmployees],
[IDX_tblEmployees_nationalidnumber] ON [dbo].[tblEmployees]
Po upuszczeniu indeksów uruchom następujące zapytanie, aby je wyświetlić:
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');
Wyjście
Przykład 2:spadek indeksu z MAXDOP i opcją ONLINE.
Podczas upuszczania indeksu możemy użyć opcji MAXDOP i ONLINE.
Uwaga :Możemy usunąć tylko indeks klastrowy za pomocą opcji MAXDOP i ONLINE.
Składnia jest następująca:
DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
- Nazwa indeksu: Określ nazwę indeksu, który chcesz usunąć.
- [SchemaName].[TableName]: Podaj trzyczęściową nazwę tabeli.
- @MaxDop_val: Określ wartość parametru MAXDOP.
- @online_option: Prawidłowe wartości to ON i OFF.
Załóżmy, że chcemy usunąć PK_Employee_BusinessEntityID indeksuj z opcjami MAXDOP i ONLINE.
Upuść indeks przy użyciu wartości opcji MAXDOP do 5, a opcja ONLINE jest WŁĄCZONA. Zapytanie o usunięcie indeksu jest następujące:
DROP INDEX [IDX_tblEmployees_gender] ON [dbo].[tblEmployees] WITH (maxdop=5,
online=ON)
Wszystkie indeksy zostały usunięte z tblEmployees tabela.
Instrukcja tabeli usuwania SQL
Instrukcja DROP TABLE usuwa tabelę z dowolnej bazy danych. Składnia DROP TABLE jest następująca:
DROP TABLE [DatabaseName].[SchemaName].[TableName]
[DatabaseName].[SchemaName].[TableName]: Podaj nazwę tabeli. Możesz użyć trzyczęściowej nazwy tabeli.
Uprawnienia
Użytkownik musi mieć ALTER uprawnienia do schematu, w którym utworzono tabelę, oraz Kontrola uprawnienia do tabeli lub być członkiem db_ddladmin stała rola.
Uwaga:
- Jeśli usuniesz tabelę, do której odwołuje się klucz obcy, musisz najpierw usunąć tę tabelę odniesienia.
- Gdy usuniesz tabelę z kolumną mającą atrybut FILESTREAM, dane przechowywane w systemie plików nie zostaną usunięte.
Przykład 1:Upuść tabelę fizyczną
W poniższym przykładzie usuwamy tabelę o nazwie tblEmployees od Pracowników Eltech baza danych:
Drop table [EltechEmployees].[dbo].[tblEmployees]
Przykład 2:Upuść tymczasowy stół
Tutaj usuwamy tabelę tymczasową. Utworzyłem tabelę tymczasową o nazwie #tblEmployee wykonując następujący kod:
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
Przed upuszczeniem tabeli sprawdzamy istnienie tabeli tymczasowej. Jeśli tabela zostanie znaleziona, zostanie usunięta.
IF Object_id(N'tempdb..#tblEmployees', N'U') IS NOT NULL
DROP TABLE #tblemployees;
go
Dlatego tymczasowa tabela #tblEmployees zostanie usunięty.
Oświadczenie o porzuceniu bazy danych
Instrukcja Drop database powoduje usunięcie całej bazy danych. Składnia jest następująca:
Drop database [DatabaseName]
[Nazwa bazy danych] :Określ nazwę bazy danych, którą chcesz usunąć.
Uprawnienia
Aby usunąć bazę danych, potrzebujesz KONTROLI lub ZMIENIAJ DOWOLNĄ BAZĘ DANYCH uprawnienia do bazy danych. Lub musisz być członkiem db_owner stała rola bazy danych.
Notatki :
- Kiedy usuniemy jakąkolwiek bazę danych w ONLINE stan, SQL Server usunie pliki bazy danych z dysku. Jeśli jednak upuszczasz bazę danych w OFFLINE stan, SQL Server nie usuwa plików bazy danych. Musimy je usunąć ręcznie.
- Aby usunąć bazę danych opublikowaną do celów transakcyjnych lub opublikowaną/zasubskrybowaną do replikacji scalającej, musimy zniszczyć replikację, a następnie usunąć bazę danych.
- Jeśli użytkownicy są połączeni z bazą danych, nie możemy usunąć bazy danych. Najpierw musimy zmienić jego stan na SINGLE_USER .
Przykład:usuń używaną bazę danych
Chcemy odrzucić pracowników Eltech Baza danych. Aby to zrobić, uruchom następujące zapytanie:
USE master
go
DROP DATABASE [EltechEmployees]
Jeśli użytkownicy są połączeni z bazą danych, wystąpi następujący błąd:
Msg 3702, Level 16, State 4, Line 3
Cannot drop database "EltechEmployees" because it is currently in use.
Aby naprawić błąd, musimy wykonać następujące zapytanie:
USE [master]
go
ALTER DATABASE eltechemployees SET single_user WITH ROLLBACK immediate
Powyższe zapytanie ustawia bazę danych w SINGLE_USER trybu i odrzuca wszystkich użytkowników podłączonych do bazy danych.
Teraz uruchommy instrukcję DROP DATABASE:
USE master
go
DROP DATABASE [EltechEmployees]
Wyjście
Jak widać, polecenie zostało wykonane pomyślnie.
Podsumowanie
Dlatego zbadaliśmy specyficzne warianty instrukcji DROP INDEX, DROP TABLE i DROP DATABASE instrukcji SQL DROP. Mam nadzieję, że praktyczne przykłady przedstawione w tym artykule pomogły wyjaśnić, jak i kiedy zastosować te polecenia.