如何分离 SQL Server 中损坏的数据库

Hac*_*cko 7 sql-server t-sql

我在外部存储上保存了 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)

Sql*_*CID 6

就像gbn评论的那样,如果数据库位于不可访问的存储上,它将被设置为可疑,并且将其设置为单用户的尝试将始终失败。对 sp_dbremove 的调用将从数据库列表中正确删除该条目,并且下次启动 SQL 服务时不会尝试使其联机。

请注意 sp_dbremove 已弃用,如果数据库可疑,则DROP DATABASE应该也能正常工作。