SQL Server中使用SQL語句關閉數據庫連接和刪除數據庫文件


 

有時候我們想用DROP DATABASE語句刪除數據庫和數據庫文件,會刪不掉,因為有其他人正在使用要刪除的數據庫,這里有一個方法可以強制斷開其它數據庫連接,再刪除數據庫。

假如我們要刪除的數據庫是[TestDB],我們可以用下面的語句:

USE [master]--注意不能夠USE [TestDB],因為[TestDB]即將被刪除,所以不能夠將當前連接設置為連接到[TestDB],否則下面的DROP DATABASE語句會報錯

ALTER DATABASE [TestDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;--首先將數據庫改為單用戶模式,WITH ROLLBACK IMMEDIATE提示切斷所有其它連接到[TestDB]的數據庫連接
DROP DATABASE [TestDB];--刪除[TestDB]及其數據庫文件

所以這個方法的核心就是先更改數據庫模式為單用戶模式"SINGLE_USER",那么什么是數據庫的單用戶模式呢?我這里貼出一個從網上找到的解釋:

So in single_user mode - you would be quite unlikely to have locking problems in that database. It is what it sounds like - single user - and it doesn't mean Single Username - it means one user. So it's used when you as a DBA want to do something that can't be done with others users in. Maybe you are trying to do a repair option of a checkdb. Maybe you are trying to change some object metadata and don't have a better way to kick other users out. Etc.

上面的解釋來自:What happens when SQL Server is in Single User Mode?

所以數據庫單用戶模式"SINGLE_USER",是指只能有一個用戶連接能夠連接到數據庫,這樣我們就可以在沒有其它數據庫連接的情況下,執行DROP DATABASE語句來刪除數據庫和其數據庫文件了。

 

 

 

 

 

 

 

-----------------------------------------

若要刪除表中的所有行,則 TRUNCATE TABLE 語句是一種快速、無日志記錄的方法。TRUNCATE TABLE 與不含有 WHERE 子句的 DELETE 語句在功能上相同。但是,TRUNCATE TABLE 速度更快,並且使用更少的系統資源和事務日志資源。

與 DELETE 語句相比,TRUNCATE TABLE 具有以下優點:

  • 所用的事務日志空間較少。

    DELETE 語句每次刪除一行,並在事務日志中為所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放用於存儲表數據的數據頁來刪除數據,並且在事務日志中只記錄頁釋放。
  • 使用的鎖通常較少。

    當使用行鎖執行 DELETE 語句時,將鎖定表中各行以便刪除。TRUNCATE TABLE 始終鎖定表和頁,而不是鎖定各行。
  • 如無例外,在表中不會留有任何頁。

    執行 DELETE 語句后,表仍會包含空頁。例如,必須至少使用一個排他 (LCK_M_X) 表鎖,才能釋放堆中的空表。如果執行刪除操作時沒有使用表鎖,表(堆)中將包含許多空頁。對於索引,刪除操作會留下一些空頁,盡管這些頁會通過后台清除進程迅速釋放。

與 DELETE 語句相同,使用 TRUNCATE TABLE 清空的表的定義與其索引和其他關聯對象一起保留在數據庫中。

 

 

 ------------------------------------------------------------------------------------------------------------------------

在MS SQLSERVER中清空所有表的數據但保留結構

有時候我們需要清空數據庫中所有用戶表的數據,如果一張表一張表的清空的話,遇到一個龐大的數據系統估計得崩潰了. 用游標加上用變量來引用表名就可以做到這一點. 用變量來引用表名對表操作可以用在存儲過程中,根據需要動太選擇引用某個表的數據或對其操作   估計用的不多,好玩而已:)
//定義游標
DECLARE tables_cursor CURSOR
   FOR
   SELECT name FROM sysobjects WHERE type = 'U' //選擇用戶表名
OPEN tables_cursor //打開游標連接

DECLARE @tablename sysname   // 定義變量
FETCH NEXT FROM tables_cursor INTO @tablename   //結果集中一行一行讀取表名
WHILE (@@FETCH_STATUS <> -1) //判斷游標狀態 
BEGIN

   EXEC ('TRUNCATE TABLE ' + @tablename)   //清空表中的數據
   FETCH NEXT FROM tables_cursor INTO @tablename //下一行數據
END

DEALLOCATE tables_cursor //關閉游標
 
例如:
-- 

CREATE proc ClearAllUserTable
as
begin

DECLARE tables_cursor CURSOR
   FOR
   SELECT name FROM sysobjects WHERE type = 'U' 
OPEN tables_cursor
DECLARE @tablename sysname   
FETCH NEXT FROM tables_cursor INTO @tablename   
WHILE (@@FETCH_STATUS <> -1) 
BEGIN
 --print   @tablename
  EXEC ('TRUNCATE TABLE ' + @tablename)   
  
   FETCH NEXT FROM tables_cursor INTO @tablename 
END
DEALLOCATE tables_cursor
end;
GO

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM