1. 刪除資料庫或者恢複數據庫時,一定要先將資料庫離線,在執行刪除、恢復操作。 SQL代碼如下: 2. 刪除資料庫用戶時,同樣也要將用戶帳號的進程給關閉,否則會提示:SQLServer無法刪除登錄名'***',因為該用戶當前正處於登錄狀態 SQL代碼如下: 效率上來說,用case 更好一些。不過如果 ...
1. 刪除資料庫或者恢複數據庫時,一定要先將資料庫離線,在執行刪除、恢復操作。
SQL代碼如下:
1 /*使資料庫離線*/ 2 ALTER DATABASE [資料庫名] SET OFFLINE WITH ROLLBACK IMMEDIATE 3 4 5 /*使資料庫重新上線*/ 6 ALTER DATABASE [資料庫名] SET online
2. 刪除資料庫用戶時,同樣也要將用戶帳號的進程給關閉,否則會提示:SQLServer無法刪除登錄名'***',因為該用戶當前正處於登錄狀態
SQL代碼如下:
1 /* 2 要關閉用戶帳號進程,必須獲取帳號的spid值,通過 kill spid 關停帳號 3 exec sp_who 可以顯示所有資料庫帳號的spid 4 我們篩選想要的spid,就必須通過一個臨時資料庫,存儲exec sp_who結果,這樣就可以使用select檢索想要的記錄 5 6 1、定義臨時表,存儲exec sp_who 結果集 7 */ 8 Create Table #tmpTable (spid int,ecid int,status varchar(32),loginname varchar(32),hostname varchar(32),blk int,dbname varchar(32),cmd varchar(32),request_id int) 9 10 /*2、向臨時表寫入記錄*/ 11 Insert Into #tmpTable EXEC sp_who 12 13 /*3、定義變數用於迴圈記錄*/ 14 Declare @i Int 15 16 /*4、 檢索指定記錄*/ 17 Select @i=Min([spid]) From #tmpTable Where [dbname]='資料庫名' And [loginname]='用戶帳號' 18 19 /*5、中止該帳號進程*/ 20 EXEC('kill '+@i)
EXEC('kill '+@i) 時,我們建議採用迴圈來處理,因為可能
Select @i=Min([spid]) From #tmpTable Where [dbname]='資料庫名' And [loginname]='用戶帳號' 的結果不存在,優化代碼:
Declare @i Int Select @i=Min([spid]) From #tmpTable Where [dbname]='資料庫名' And [loginname]='用戶帳號' While @i Is Not Null Begin EXEC('kill' + @i) Select @i=Min([spid]) From #tmpTable Where [dbname]='資料庫名' And [loginname]='用戶帳號' And 1=0 End
效率上來說,用case 更好一些。不過如果針對多個用戶,用迴圈比較好:
Select @i=Min([spid]) From #tmpTable Where [dbname]='資料庫名' And [loginname]='用戶帳號' And [spid]>@i