我在外部存储上保存了 Sql 服务器数据文件。我想分离特定的数据库。如果未连接外部存储,我想删除数据库。
这是安全的方法吗:
DECLARE @DB_NAME SYSNAME = 'Database_name';
BEGIN TRY
-- Check if db has correct structure
DBCC CHECKDB (@DB_NAME) WITH ALL_ERRORMSGS ;
-- Stop using db
EXEC( 'ALTER DATABASE ' +@DB_NAME + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE; ');
-- Detach db
EXEC sp_detach_db @dbname= @DB_NAME , @skipchecks= 'true';
END TRY
BEGIN CATCH
-- DB files are missing - drop database
IF ERROR_NUMBER() = 945
BEGIN
EXEC ('DROP DATABASE ' + @DB_NAME);
END
END CATCH;
Run Code Online (Sandbox Code Playgroud)
就像gbn评论的那样,如果数据库位于不可访问的存储上,它将被设置为可疑,并且将其设置为单用户的尝试将始终失败。对 sp_dbremove 的调用将从数据库列表中正确删除该条目,并且下次启动 SQL 服务时不会尝试使其联机。
请注意 sp_dbremove 已弃用,如果数据库可疑,则DROP DATABASE应该也能正常工作。