2012-10-03 92 views
43

我正在使用SQL Server 2008,我似乎無法刪除並創建數據庫。無法刪除並在sql server中創建數據庫

我已經嘗試了幾種不同的方法,但我總是最終無法放棄或試圖「使用」,似乎在創建之前。

我目前的嘗試看起來像這樣。

use master; 
GO 
IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'test') 
BEGIN 
DROP DATABASE [test]; 
END 
GO 
CREATE DATABASE [test]; 
GO 
use [test]; 
GO 

GO被建議在MS論壇,以此來阻止選擇數據庫時出現的一些問題。

有了這個,我目前得到的輸出(具有相同名稱的礦石現有數據庫):消息3702,級別16,狀態4,3號線

無法除去數據庫「測試」,因爲它目前正在使用中。
Msg 1801,Level 16,State 3,Line 1
數據庫'測試'已經存在。選擇不同的數據庫名稱。
Msg 2714,Level 16,State 6,Line 2
數據庫中已經有一個名爲'staff_type'的對象。

對於我數據庫中的每個表重複最後2行。

回答

61

我們通常會得到這個錯誤如果您打開了任何連接到這個數據庫的查詢窗口,所以確保關閉所有打開的連接到db的查詢窗口,您試圖刪除它。

請勿使用您要刪除的數據庫。使用master來刪除任何用戶數據庫,這是一個很好的做法。

確保沒有其他進程附加到您要刪除的數據庫。

EXEC sp_who2 
--Run kill spid for each process that is using the database to be dropped. 
kill <<processid>> -- Kill 57 

使用EXEC sp_who2並檢查數據庫名欄,你的數據庫名稱不應該出現在列表中,如果它出現殺使用kill <<processid>>然後嘗試刪除該進程。

試試這個代碼。在數據庫上

use master 
GO 

IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'test') 
DROP DATABASE [test] 
GO 

CREATE DATABASE [test] 
GO 

use [test] 
GO 
+1

一個進程正在堅持下去。謝謝。 – TrewTzu

+0

@TrewTzu高興地幫助你:) –

+3

這個答案與[this](http://stackoverflow.com/a/13672187/2545927)結合爲我做了。 – kkuilla

1

如果使用Master時出現上述錯誤。那麼你需要完全關閉SQL Server Management Studio,然後再次打開它,並與它連接並運行上述查詢.....

希望,它會作品.....

28

試試這個:

use master; 
GO 

ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 

GO 
..... 

這將回滾正在該數據庫上運行的任何事務,並將SQL Server數據庫引入單用戶模式。

+0

你能解釋一下你的查詢嗎? –

+1

@LolCoder:這將回滾在該數據庫上運行的任何事務,並將SQL Server數據庫引入單用戶模式。 –

+1

這種方法好得多。它也被討論[在這裏](http://stackoverflow.com/questions/1711840/how-do-i-specify-close-existing-connections-in-sql-script)。 – dmigo

39
  1. 右鍵單擊並選擇「刪除」(或左鍵單擊它,然後按「刪除」鍵)。
  2. 當「刪除對象」對話框出現時,請確保選中「關閉現有連接」(請參見下文,默認情況下未選中)。
  3. Press 「OK」

enter image description here

+3

最簡單的方法,謝謝! +1 –

+0

我不敢相信我在使用Sql Server多年後發現了這一點。 – ilans

3

這會給你所有的當前連接:

select spid, hostname, [program_name], open_tran, hostprocess, cmd 
from master.dbo.sysprocesses 
where dbid = db_id('your_database_name') 

然後,你可以使用T-SQL遊標執行殺@spid,其中用於@spid值是從以前的查詢。

0

您需要關閉所有使用此數據庫的查詢窗口,您也可能需要完全重新啓動SQL Server。這可能會解決您的問題。

0

除了上面mr_eclair的回答,我想補充:選擇了當期的數據庫,其中必須被關閉

  • 所有查詢窗口。
  • 另一種選擇是使數據庫處於單用戶模式。>>它將終止所有其他用戶進程。
  • set OFFLINE WITH ROLLBACK IMMEDIATE。它會使數據庫處於離線模式並將其帶回
  • 使用sp_who2知道使用當前數據庫的用戶。並殺死所需的spids
0

如果您打開的SQL文件先前已經查詢過您嘗試刪除的數據庫,則這些將防止丟棄。如上所述。關閉這些解決問題,我

1
ALTER DATABASE test1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

ALTER DATABASE test1 SET OFFLINE; 

DROP DATABASE test1 

試試這個裏面存儲過程

0

使用SQL Server Management Studio中工作時,我遇到這種類型的問題。經過多天的搜索和實驗,我終於找到了一個問題。

注意:您應該先創建一個下降,此表創建表腳本,如果不是你會不會有你的表

1,首先創建只是你的表與他們coresponding外鍵。

2 - 創建與這些表中的視覺圖(SQL表達的數據庫,數據庫名稱的數據庫就可以了圖,右鍵單擊並選擇新的數據庫圖表)

3添加所需的數據表上的圖表和創建關係這些數據表與創建表

過程中添加相應的外鍵之間的4-然後保存在數據庫

在,你必須忘了在數據表中添加特定領域的情況下,你可以很容易地刪除和創建數據表,請執行以下步驟:

1,打開相應的數據庫的數據庫圖表

2,刪除舊錶之間存在的所有關係到要添加一些字段,以及其他表

3,然後刪除從圖對應的表(右鍵單擊表,然後選擇從數據表刪除表)

4保存圖(按Ctrl + S)

5到要刪除並創建表

6右鍵單擊表格並選擇(腳本表作爲然後選擇拖放並創建然後去新的查詢編輯器窗口),這將腳本您的表在新的表,這時您可以修改它到您的需要,與和新老同臺

舊錶爲例

 USE [DatabaseName] 
     GO 

     /****** Object: Table [dbo].[Administrateur] Script Date: 10/11/2016 2:06:04 PM ******/ 
     DROP TABLE [dbo].[Administrateur] 
    GO 

     /****** Object: Table [dbo].[Administrateur] Script Date: 10/11/2016 2:06:04 PM ******/ 
    SET ANSI_NULLS ON 
    GO 

    SET QUOTED_IDENTIFIER ON 
    GO 

    CREATE TABLE [dbo].[Administrateur](
[AdministrateurID] [int] IDENTITY(1,1) NOT NULL, 
[Name] [nvarchar](max) NOT NULL, 
[Surname] [nvarchar](max) NULL, 
[Phone] [nvarchar](max) NOT NULL, 
[Username] [nvarchar](max) NOT NULL, 
[Password] [nvarchar](max) NOT NULL, 
[Sexe] [nvarchar](max) NOT NULL, 

CONSTRAINT [PK_Administrateur] PRIMARY KEY CLUSTERED 
(
[AdministrateurID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

現在的頁3個新字段(電子郵件,圖片和鹽)

USE [DatabaseName] 
    GO 

    /****** Object: Table [dbo].[Administrateur] Script Date: 10/11/2016 2:06:04 PM ******/ 
    DROP TABLE [dbo].[Administrateur] 
    GO 

    /****** Object: Table [dbo].[Administrateur] Script Date: 10/11/2016 2:06:04 PM ******/ 
    SET ANSI_NULLS ON 
    GO 

    SET QUOTED_IDENTIFIER ON 
    GO 

    CREATE TABLE [dbo].[Administrateur](
[AdministrateurID] [int] IDENTITY(1,1) NOT NULL, 
[Name] [nvarchar](max) NOT NULL, 
[Surname] [nvarchar](max) NULL, 
[Phone] [nvarchar](max) NOT NULL, 
[Email] [nvarchar](max) NOT NULL, 
[Username] [nvarchar](max) NOT NULL, 
[Password] [nvarchar](max) NOT NULL, 
[Image] [nvarchar](max) NOT NULL, 
[Sexe] [nvarchar](max) NOT NULL, 
[Salt] [nvarchar](max) NOT NULL, 
CONSTRAINT [PK_Administrateur] PRIMARY KEY CLUSTERED 
    (
    [AdministrateurID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

那麼新的相同的表修改Datatable,按執行。它不會執行第一次,會寫入一些遇到的錯誤,但不關心,只需按第二次執行。此時,它將在文檔底部執行並寫入成功消息。然後選擇數據庫並單擊Refresh(或按F5),他將在某臺計算機上更新數據庫的表格,或者需要重新啓動程序然後在別人的電腦上安裝更新程序(我不知道爲什麼,所以不要問我解釋)。

現在回到圖表和dd更新的表,然後將這些(這個)表連接到與它有任何關係的表。

希望這會節省一些人的時間。

我不知道

0

我知道我已經遲到了比賽。但這裏是我如何做到這一點一步。這種情況經常發生,我不想在很多步驟中做到這一點,所以我將它合併爲一個步驟。

DECLARE @databaseName VARCHAR(30); 
DECLARE @resource_type_to_kill VARCHAR(30); 
DECLARE @processIdToKill INT; 

SET @databaseName = 'yourDatabaseName' 
SET @resource_type_to_kill = 'DATABASE' 

DECLARE @TempSession TABLE 
(
    ProcessIdToKill INT, 
    DatabaseName VARCHAR(100), 
    Request_Mode VARCHAR(100), 
    HostName VARCHAR(100), 
    LoginTime VARCHAR(100), 
    LoginName VARCHAR(100), 
    Status VARCHAR(100), 
    Reads VARCHAR(100), 
    Writes VARCHAR(100) 
); 
INSERT @TempSession 
SELECT DISTINCT 
    session_id, 
    name, 
    request_mode, 
    host_name, 
    login_time, 
    login_name, 
    status, 
    reads, 
    writes 
FROM sys.dm_exec_sessions 
    LEFT OUTER JOIN sys.dm_tran_locks ON sys.dm_exec_sessions.session_id = sys.dm_tran_locks.request_session_id 
    INNER JOIN sys.databases ON sys.dm_tran_locks.resource_database_id = sys.databases.database_id 
WHERE resource_type = @resource_type_to_kill 
AND name = @databaseName 
ORDER BY name 

--SELECT * FROM @TempSession --Debugging 

SELECT @processIdToKill = ProcessIdToKill FROM @TempSession 

--SELECT @processIdToKill --Debugging 

--Run kill for the process that is using the database to be dropped. 
DECLARE @SQL nvarchar(1000) 
SET @SQL = 'KILL ' + CAST(@processIdToKill as varchar(4)) 
PRINT 'Killing the process' 
EXEC (@SQL) 

--And then drop the database 
DECLARE @DropSQL nvarchar(1000) 
SET @DropSQL = 'DROP DATABASE ' + @databaseName 
PRINT 'Dropping the database' 
EXEC (@DropSQL) 

如果有很多正在使用數據庫的進程,您只需要多次運行該進程。

0

這裏完全是隨意的想法。但是,如果您在Visual Studio中打開SQL DB項目,則即使您未採取任何操作或在SSMS中打開查詢窗口,其開放性也會佔用流程。

這是我的情況。完全關閉Visual Studio,允許我放棄沒有問題的數據庫。

相關問題