Ngăn chặn DROP DATABASE SQL Server

Còn được gọi là lỗi 3702, lỗi SQL Server Không thể bỏ cơ sở dữ liệu vì nó hiện đang được sử dụng thường xuyên trong các môi trường nhiều người dùng. Có thể quản lý cơ sở dữ liệu SQL bằng tập lệnh hoặc thông qua các cửa sổ khác nhau của SQL Server Management Studio. Ví dụ: bạn có thể chỉ cần xóa cơ sở dữ liệu bằng lệnh SQL DROP DATABASE

Mục lục

Hướng dẫn sửa lỗi SQL Server Can't drop the database

Tuy nhiên, nếu có các kết nối đang hoạt động trên cơ sở dữ liệu bị xóa, thì cơ sở dữ liệu sẽ trả về thông báo lỗi vì không thể xóa cơ sở dữ liệu có kết nối đang hoạt động. Bài viết khác này nói về cách tạo cơ sở dữ liệu với các tùy chọn mặc định bằng giao diện người dùng đồ họa SSMS. Văn bản thông báo lỗi chính xác như sau

Không thể bỏ cơ sở dữ liệu vì nó hiện đang được sử dụng. [Máy chủ Microsoft SQL, Lỗi. 3702]

Ghi chú. Hãy cẩn thận kiểm tra các bản sao lưu cơ sở dữ liệu trước khi xóa hoàn toàn. Đặc biệt là trong các dự án quan trọng và môi trường sản xuất

Loại tập lệnh này tạo ra lỗi

USE [master];
GO

DROP DATABASE [DB1];
GO

Một cách khác là kiểm tra sự tồn tại của cơ sở dữ liệu trên máy chủ, trước khi chạy lệnh Drop Database, ví dụ như thế này

USE [master];
GO

IF EXISTS [
	SELECT name 
	FROM master.dbo.sysdatabases
	WHERE name = 'DB1'
]
DROP DATABASE [DB1];
GO

Để tránh lỗi này, hãy đóng tất cả các kết nối đang hoạt động với cơ sở dữ liệu trước khi hủy và chấm dứt các truy vấn hiện tại. Sau đó, đóng các tab trong SSMS hoặc kết thúc rõ ràng các kết nối đang mở trên cơ sở dữ liệu. Cuối cùng, đóng các tab đang hoạt động nếu hiện chỉ có một người dùng được kết nối. Đối với bước thứ hai, hãy chạy hai thao tác này

1. Thực hiện quy trình sp_who2 để xác định SPID của các phiên đang hoạt động

Trong ảnh chụp màn hình, chúng tôi xác định các phiên hoạt động cho cơ sở dữ liệu DB1. Chúng tôi thấy một người dùng có SPID 51

sp_who2

Chạy lệnh sp_who2 để sửa lỗi SQL Server 3702

2. Đóng phiên với lệnh tiêu diệt SQL Server và SPID

Chính SPID đang hoạt động ngăn cơ sở dữ liệu bị hủy. Thật vậy, RDBMS không cho phép loại bỏ cơ sở dữ liệu với các phiên đang hoạt động

2. 1 Chấm dứt tất cả các phiên với các SPID được tìm thấy

Sử dụng ID tiến trình máy chủ [SPID] được tìm thấy trong truy vấn trước đó để kết thúc phiên. Thực hiện truy vấn trong SSMS

kill 51

Sử dụng thủ tục hủy để kết thúc phiên với SPID được xác định trước đó

2. 2 Thực thi lại tập lệnh thả cơ sở dữ liệu mà không gặp lỗi

Lặp lại thao tác cho đến khi không nhìn thấy kết nối đang hoạt động nào trong danh sách. Để đi xa hơn, đây là tài liệu chính thức của lệnh tiêu diệt T-SQL. Lỗi lệnh sql “không thể xóa cơ sở dữ liệu vì nó hiện đang được sử dụng” là một lỗi cổ điển. Thật vậy, nó là một đối tượng cho phép nhiều kết nối từ những người dùng khác nhau cùng một lúc

Kết luận về lỗi SQL Server 3702

Hướng dẫn MS SQL này giải thích cách tránh thông báo lỗi SQL Server phổ biến. Không thể bỏ cơ sở dữ liệu vì nó hiện đang được sử dụng. Đó là một lỗi phổ biến và mẹo này rất hữu ích khi tạo và loại bỏ nhiều cơ sở dữ liệu trong môi trường phát triển và thử nghiệm chẳng hạn

Làm cách nào để loại bỏ hoàn toàn cơ sở dữ liệu SQL Server?

Cơ sở dữ liệu, không giống như bảng, không thể bị xóa hoặc kết xuất. Một cơ sở dữ liệu phải được loại bỏ, tôi. e. , đã xóa hoàn toàn để xóa tất cả nội dung của nó. Sử dụng lệnh DROP DATABASE để xóa cơ sở dữ liệu SQL Server

Làm trống nhật ký giao dịch SQL Server và sửa lỗi 9002

Hướng dẫn quản trị SQL Server

Để đi xa hơn và tìm hiểu thêm về cơ sở dữ liệu, hãy tìm thêm các hướng dẫn về chủ đề quản trị cơ sở dữ liệu SQL Server

Hôm nay tôi sẽ chia sẻ một đoạn mã rất đơn giản nhưng hữu ích mà tôi đã triển khai trong nhiều phiên bản SQL trong nhiều năm để ngăn cơ sở dữ liệu vô tình bị xóa. Một trong những cách đơn giản nhất là nhờ sự trợ giúp của trình kích hoạt DDL đã được giới thiệu từ SQL Server 2005. Dưới đây là mã mà tôi đã thực hiện

--TẠO MỘT THÔNG TIN ĐĂNG NHẬP MÀ SẼ ĐƯỢC SỬ DỤNG NHƯ MỘT TÀI KHOẢN MÃI MÃI CHO NHỮNG NGƯỜI GỬI THƯ CHỈ CHO BỘ KÍCH HOẠT NÀY

SỬ DỤNG [CHỦ]

ĐI

TẠO ĐĂNG NHẬP [thư] VỚI MẬT KHẨU='', DEFAULT_DATABASE=[msdb], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

ĐI

--GIAO TÀI KHOẢN Mạo danh TRUY CẬP ĐẾN MSDB VÀ DATABASEMAIL

SỬ DỤNG [msdb]

ĐI

TẠO NGƯỜI DÙNG [mail] ĐỂ ĐĂNG NHẬP [mail]

ĐI

EXEC sp_addrolemember 'DatabaseMailUserRole', 'mail'

ĐI

--CẤP QUYỀN Mạo danh CÔNG CỘNG ĐỐI VỚI TÀI KHOẢN MÃI MÃI ĐỂ NGƯỜI KÍCH HOẠT CÓ THỂ GỬI THƯ

CẤP MÃ MÃI MÃ KHI ĐĂNG NHẬP. gửi thư đến CÔNG KHAI

ĐI

--TẠO CƠ SỞ DỮ LIỆU ĐĂNG NHẬP

/*

TẠO CƠ SỞ DỮ LIỆU

*/

ĐI

--TẠO BẢNG GHI

TẠO BẢNG [dbo]. [Nhật ký cơ sở dữ liệu][

[DatabaseLogID] [int] IDENTITY[1,1] NOT NULL,

[PostTime] [datetime] NOT NULL,

[Người dùng cơ sở dữ liệu] [tên hệ thống] KHÔNG NULL,

[Sự kiện] [tên hệ thống] NOT NULL,

[Tên cơ sở dữ liệu] [tên hệ thống] KHÔNG NULL,

[Lược đồ] [tên hệ thống] NULL,

[Đối tượng] [tên hệ thống] NULL,

[TSQL] [nvarchar][max] NOT NULL,

[XmlEvent] [xml] KHÔNG NULL,

RÀNG BUỘC [PK_DatabaseLog_DatabaseLogID] KHÓA CHÍNH KHÔNG BAO GỒM

[

[ID nhật ký cơ sở dữ liệu] ASC

]VỚI [PAD_INDEX = TẮT, STATISTICS_NORECOMPUTE = TẮT, IGNORE_DUP_KEY = TẮT, ALLOW_ROW_LOCKS = BẬT, ALLOW_PAGE_LOCKS = BẬT] BẬT [CHÍNH]

] BẬT [CHÍNH]

ĐI

--TẠO TÀI KHOẢN MANG TÍNH TRONG CƠ SỞ DỮ LIỆU ĐĂNG NHẬP VÀ Gán QUYỀN TRUY CẬP VIẾT VÀO BẢNG GHI

SỬ DỤNG [ĐĂNG NHẬP CƠ SỞ DỮ LIỆU]

ĐI

TẠO NGƯỜI DÙNG [mail] ĐỂ ĐĂNG NHẬP [mail]

ĐI

CHÈN CẤP TRÊN DBO. Cơ sở dữ liệuĐăng nhập vào thư

ĐI

--TẠO BỘ KÍCH HOẠT DDL BÊN MÁY CHỦ ĐỂ NGĂN NGỪA MỌI THAY ĐỔI DDL

--NHỚ THAY ĐỔI MSDB. DBO. DÒNG SP_SEND_DBMAIL ĐỂ PHÙ HỢP VỚI THIẾT LẬP HỆ THỐNG

TẠO KÍCH HOẠT [antg] TRÊN TẤT CẢ MÁY CHỦ

CHO DDL_SỰ KIỆN

BẰNG

NẾU IS_SRVROLEMEMBER['sysadmin'] = 0

BẮT ĐẦU

KHAI BÁO @data XML;

KHAI BÁO @schema SYSNAME;

KHAI BÁO @object SYSNAME;

KHAI THÁC @eventType SYSNAME;

KHAI BÁO @user SYSNAME;

KHAI BÁO @Mess NVARCHAR[MAX];

KHAI BÁO @dbname SYSNAME;

BỘ @user = SUSER_NAME[]

SET @data = EVENTDATA[];

THIẾT LẬP @eventType = @data. value['[/EVENT_INSTANCE/EventType][1]', 'SYSNAME'];

SET @schema = @data. value['[/EVENT_INSTANCE/SchemaName][1]', 'SYSNAME'];

THIẾT LẬP @object = @data. value['[/EVENT_INSTANCE/ObjectName][1]', 'SYSNAME'];

ĐẶT @dbname = @data. value['[/EVENT_INSTANCE/DatabaseName][1]','SYSNAME'];

IN 'Chỉ quản trị viên hệ thống mới có thể sửa đổi máy chủ này và cơ sở dữ liệu của nó'+char[39]+'

IN 'Câu lệnh của bạn+char[39]+'r đã được ghi lại và gửi qua email cho nhóm DBA'

GIAO DỊCH HOÀN LẠI

THỰC HIỆN NHƯ ĐĂNG NHẬP = 'mail'

CHÈN ###################. dbo. [Nhật ký cơ sở dữ liệu]

[

[PostTime],

[Người dùng cơ sở dữ liệu],

[Biến cố],

[Tên cơ sở dữ liệu],

[Lược đồ],

[Vật],

[TSQL],

[Sự kiện Xml]

]

GIÁ TRỊ

[

HẸN GẶP[],

CHUYỂN ĐỔI[SYSNAME, @user],

@loại sự kiện,

@dbname,

CHUYỂN ĐỔI[SYSNAME, @schema],

CHUYỂN ĐỔI[SYSNAME, @object],

@dữ liệu. giá trị['[/EVENT_INSTANCE/TSQLCommand][1]', 'NVARCHAR[MAX]'],

@dữ liệu

];

ĐẶT @Mess =

' Người dùng = ' + '' + UPPER[CONVERT[SYSNAME, @user]] + '' + ' đã cố gắng thực hiện thao tác DDL sau'

+ '

'

+ 'Thao tác DDL = ' + '' + @eventType + ''

+ '

'

+ 'Đối tượng = ' + '' + @dbname + '. ' + CHUYỂN ĐỔI[SYSNAME, @schema] + '. ' + CHUYỂN ĐỔI[SYSNAME, @object] + '';

CHỌN @Mess

THỰC HIỆN MSDB. DBO. sp_send_dbmail @profile_name = , @recipients = '', @subject = 'Đã phát hiện và khôi phục thay đổi cấp độ máy chủ', @body = @Mess, @body_format = 'HTML'

SQL Server có thể ngăn ngừa mất dữ liệu như thế nào?

Sao lưu, Sao lưu và Sao lưu . Thường xuyên thực hiện các thủ tục sao lưu đảm bảo hoạt động kinh doanh được liên tục. Sao lưu có thể giúp ích rất nhiều khi cơ sở dữ liệu phát sinh sự cố.

Làm cách nào để tắt trình kích hoạt DDL trong SQL Server?

Để tắt trình kích hoạt DDL với phạm vi máy chủ [TRÊN TẤT CẢ MÁY CHỦ] hoặc trình kích hoạt đăng nhập, người dùng phải có quyền MÁY CHỦ KIỂM SOÁT trên máy chủ. To disable a DDL trigger with database scope [ON DATABASE], at a minimum, a user must have ALTER ANY DATABASE DDL TRIGGER permission in the current database.

Cơ sở dữ liệu nào không thể bị hủy?

Không thể xóa cơ sở dữ liệu hệ thống .

Cơ sở dữ liệu Drop có giống với cơ sở dữ liệu DELETE không?

Đơn giản. lệnh DELETE xóa các hàng phù hợp, lệnh DROP xóa toàn bộ bảng .

Chủ Đề