Câu lệnh SQL DROP là một lệnh xóa các thành phần cơ sở dữ liệu hiện có hoặc toàn bộ cơ sở dữ liệu với tất cả dữ liệu của chúng vĩnh viễn. Có những lệnh SQL khác có tác dụng tương tự (TRUNCATE hoặc DELETE), nhưng đặc trưng của lệnh DROP là nó xóa mọi thứ cùng một lúc. Ví dụ:DROP TABLE xóa dữ liệu bảng, chỉ mục, trình kích hoạt, quyền, ràng buộc - toàn bộ lược đồ của bảng.
Câu lệnh DROP yêu cầu một người phải cực kỳ cẩn thận khi sử dụng nó. Sau khi thực hiện, nó không thể quay lại được. Thông tin bị mất cho tốt. Cơ hội duy nhất để trả lại dữ liệu sẽ là khôi phục một bản sao lưu. Tuy nhiên, trong nhiều trường hợp, chúng ta phải áp dụng các câu lệnh DROP. Bài viết này sẽ tập trung vào các trường hợp như vậy, các biến thể DROP cụ thể và cách sử dụng chúng một cách an toàn.
Chuẩn bị
Để xem xét các trường hợp của chúng tôi, chúng tôi sẽ cần một cơ sở dữ liệu với dữ liệu. Tôi đã tạo cơ sở dữ liệu thử nghiệm có tên EltechErantyees với truy vấn sau:
USE [master]
go
CREATE DATABASE [EltechEmployees]
go
Trong cơ sở dữ liệu đó, tôi đã tạo bảng tblEprisees - truy vấn sau đây phục vụ cho điều đó:
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
Bước tiếp theo là tạo hai chỉ mục không phân nhóm và một chỉ mục được phân nhóm trên tblE Employees bảng.
- Chỉ mục không theo nhóm: IDX_tblErantyees_loginID và IDX_tblErantyees_nationalidnumber
- Một chỉ mục được nhóm lại: IDX _tblEosystemees_uality
Để tạo các chỉ mục này, hãy sử dụng truy vấn sau:
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
Hãy xem các chỉ mục mà chúng tôi đã tạo:
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');
Đầu ra
Bây giờ chúng ta có thể chuyển sang các ví dụ thực tế.
Tuyên bố về chỉ mục thả
Trường hợp đầu tiên của chúng tôi là giảm các chỉ mục khỏi một bảng.
Ví dụ 1:Bỏ một hoặc nhiều chỉ mục khỏi bảng
Cú pháp để bỏ nhiều chỉ mục như sau:
Drop index
[IndexName] on [SchemaName].[TableName] ,
[IndexName] on [SchemaName].[TableName]
- Tên chỉ mục: Chỉ định tên chỉ mục bạn muốn thả sau câu lệnh Chỉ mục thả .
- [SchemaName]. [TableName]: Chỉ định tên cơ sở dữ liệu, tên lược đồ và tên bảng. Câu lệnh Drop table cho phép bạn sử dụng tên gồm hai phần của bất kỳ đối tượng cơ sở dữ liệu nào. Các giá trị của [SchemaName]. [TableName] phải được chỉ định sau từ khóa BẬT .
Giả sử chúng ta muốn loại bỏ IX_loginID_tblE Employees và IDX_nationalidnumber_tblEprisees trên tblEprisees bàn. Để làm điều đó, hãy chạy truy vấn dưới đây:
DROP INDEX
[IDX_tblEmployees_loginID] ON [dbo].[tblEmployees],
[IDX_tblEmployees_nationalidnumber] ON [dbo].[tblEmployees]
Sau khi các chỉ mục bị loại bỏ, hãy chạy truy vấn sau để xem chúng:
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');
Đầu ra
Ví dụ 2:Giảm chỉ mục với MAXDOP và Tùy chọn ONLINE.
Chúng tôi có thể sử dụng các tùy chọn MAXDOP và ONLINE trong khi giảm chỉ mục.
Lưu ý :Chúng tôi chỉ có thể giảm chỉ mục theo nhóm bằng cách sử dụng các tùy chọn MAXDOP và ONLINE.
Cú pháp như sau:
DROP Index [indexName] on [schemaname].[tablename] with (MAXDOP = @maxdop_val, ONLINE = @online_option)
- Tên chỉ mục: Chỉ định tên chỉ mục bạn muốn bỏ.
- [Tên lược đồ]. [Tên máy tính bảng]: Chỉ định tên ba phần của bảng.
- @MaxDop_val: Chỉ định giá trị của tham số MAXDOP.
- @online_option: Các giá trị hợp lệ là BẬT và TẮT.
Giả sử chúng ta muốn loại bỏ PK_EFastee_BusinessEntityID lập chỉ mục với các tùy chọn MAXDOP và ONLINE.
Giảm chỉ mục bằng cách sử dụng giá trị của tùy chọn MAXDOP xuống 5 và tùy chọn ONLINE là BẬT. Truy vấn để giảm chỉ mục như sau:
DROP INDEX [IDX_tblEmployees_gender] ON [dbo].[tblEmployees] WITH (maxdop=5,
online=ON)
Tất cả các chỉ mục đã bị xóa khỏi tblE Employees bảng.
Câu lệnh bảng thả SQL
Câu lệnh DROP TABLE xóa bảng khỏi bất kỳ cơ sở dữ liệu nào. Cú pháp của DROP TABLE như sau:
DROP TABLE [DatabaseName].[SchemaName].[TableName]
[DatabaseName]. [SchemaName]. [TableName]: Chỉ định tên bảng. Bạn có thể sử dụng tên ba phần của bảng.
Quyền
Người dùng phải có ALTER quyền trên giản đồ nơi bảng đã được tạo và Điều khiển quyền trên bàn hoặc là thành viên của db_ddladmin vai trò cố định.
Lưu ý:
- Nếu bạn bỏ một bảng được tham chiếu bằng khóa ngoại, trước tiên bạn phải bỏ bảng tham chiếu đó.
- Khi bạn thả một bảng có cột có thuộc tính FILESTREAM, dữ liệu được lưu trữ trong hệ thống tệp sẽ không bị xóa.
Ví dụ 1:Thả một Bảng Vật lý
Trong ví dụ sau, chúng tôi đang loại bỏ bảng có tên tblEprisees từ EltechEprisees cơ sở dữ liệu:
Drop table [EltechEmployees].[dbo].[tblEmployees]
Ví dụ 2:Bỏ một bảng tạm thời
Ở đây, chúng tôi đang thả một bảng tạm thời. Tôi đã tạo một bảng tạm thời có tên #tblErantyee bằng cách thực thi đoạn mã sau:
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
Trước khi thả bảng, chúng tôi kiểm tra sự tồn tại của bảng tạm. Nếu bảng được tìm thấy, nó sẽ bị loại bỏ.
IF Object_id(N'tempdb..#tblEmployees', N'U') IS NOT NULL
DROP TABLE #tblemployees;
go
Do đó, bảng tạm thời #tblEprisees sẽ bị loại bỏ.
Câu lệnh cơ sở dữ liệu thả
Câu lệnh thả cơ sở dữ liệu hoạt động để thả toàn bộ cơ sở dữ liệu. Cú pháp như sau:
Drop database [DatabaseName]
[Tên cơ sở dữ liệu] :Chỉ định tên của tên cơ sở dữ liệu bạn muốn thả.
Quyền
Để loại bỏ cơ sở dữ liệu, bạn cần CONTROL hoặc ALTER BẤT KỲ CƠ SỞ DỮ LIỆU NÀO quyền trên cơ sở dữ liệu. Hoặc, bạn phải là thành viên của db_owner vai trò cơ sở dữ liệu cố định.
Ghi chú :
- Khi chúng tôi thả bất kỳ cơ sở dữ liệu nào trong ONLINE trạng thái, SQL Server sẽ thả các tệp cơ sở dữ liệu khỏi đĩa. Tuy nhiên, nếu bạn đang bỏ cơ sở dữ liệu trong NGOẠI TUYẾN trạng thái, Máy chủ SQL không thả tệp cơ sở dữ liệu. Chúng tôi phải xóa chúng theo cách thủ công.
- Để loại bỏ cơ sở dữ liệu đã xuất bản để giao dịch hoặc xuất bản / đăng ký bản sao hợp nhất, chúng tôi phải hủy bản sao và sau đó loại bỏ cơ sở dữ liệu.
- Nếu người dùng được kết nối với cơ sở dữ liệu, chúng tôi không thể bỏ cơ sở dữ liệu. Trước tiên, chúng tôi phải thay đổi trạng thái của nó thành SINGLE_USER .
Ví dụ:Bỏ Cơ sở dữ liệu đang được sử dụng
Chúng tôi muốn loại bỏ EltechE Employees cơ sở dữ liệu. Để làm điều đó, hãy chạy truy vấn sau:
USE master
go
DROP DATABASE [EltechEmployees]
Nếu người dùng được kết nối với cơ sở dữ liệu, bạn sẽ gặp phải lỗi sau:
Msg 3702, Level 16, State 4, Line 3
Cannot drop database "EltechEmployees" because it is currently in use.
Để sửa lỗi, chúng tôi phải thực hiện truy vấn sau:
USE [master]
go
ALTER DATABASE eltechemployees SET single_user WITH ROLLBACK immediate
Truy vấn trên đặt cơ sở dữ liệu trong SINGLE_USER và loại bỏ tất cả người dùng được kết nối với cơ sở dữ liệu.
Bây giờ, chúng ta hãy chạy câu lệnh DROP DATABASE:
USE master
go
DROP DATABASE [EltechEmployees]
Đầu ra
Như bạn có thể thấy, lệnh đã được thực thi thành công.
Tóm tắt
Do đó, chúng tôi đã kiểm tra các biến thể cụ thể của câu lệnh DROP INDEX, DROP TABLE và DROP DATABASE các biến thể cụ thể của câu lệnh SQL DROP. Hy vọng rằng các ví dụ thực tế được trình bày trong bài viết này đã giúp giải thích cách thức và thời điểm áp dụng các lệnh này.