无法在sql server中删除并创建数据库

时间:2012-10-03 05:46:04

标签: sql sql-server-2008 tsql

我正在使用SQL Server 2008,我似乎无法删除并创建数据库。

我尝试了几种不同的方法,但我总是在它似乎被创建之前没有丢弃或试图“使用”。

我目前的尝试是这样的。

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

在MS论坛上建议GO作为一种方法来阻止选择数据库时出现的一些问题。

有了这个,我目前得到的输出(带有同名的现有数据库):

  

Msg 3702,Level 16,State 4,Line 3
  无法删除数据库“test”,因为它当前正在使用中   消息1801,级别16,状态3,行1   数据库'test'已经存在。选择其他数据库名称   Msg 2714,Level 16,State 6,Line 2
  数据库中已经有一个名为“staff_type”的对象。

对我数据库中的每个表重复最后两行。

14 个答案:

答案 0 :(得分:69)

我们通常会收到此错误如果您已打开任何与此数据库连接的查询窗口,请确保关闭所有已打开的查询窗口,这些窗口已连接到您要删除的数据库。

请勿使用您尝试删除的数据库。使用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并检查DBName列,您的数据库名称不应出现在列表中,如果它显示使用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 :(得分:41)

  1. 右键单击数据库并选择“删除”(或左键单击它并按“del”键。
  2. 当出现“删除对象”对话框时,请务必选中“关闭现有连接”(请参见下文,默认情况下未选中)。
  3. “确定”
  4. enter image description here

答案 2 :(得分:30)

试试这个:

use master;
GO

ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

GO
.....

这将回滚在该数据库上运行的任何事务,并以单用户模式运行SQL Server数据库。

答案 3 :(得分:3)

这将为您提供所有当前连接:

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

然后你可以使用t-sql游标执行kill @spid,其中@spid的值来自上一个查询。

答案 4 :(得分:3)

ALTER DATABASE test1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE

ALTER DATABASE test1 SET OFFLINE;

DROP DATABASE test1

在存储过程内部尝试

答案 5 :(得分:1)

如果您在使用Master时遇到上述错误。然后你需要完全关闭SQL Server Management Studio并再次打开它并连接到它并运行上述查询......

希望,它会起作用.....

答案 6 :(得分:0)

您需要使用此数据库关闭所有查询窗口,您可能还需要完全重新启动SQL Server。这可能会解决您的问题。

答案 7 :(得分:0)

除了上面的mr_eclair的回答,我想补充一下:

  • 必须关闭所有查询窗口,并选择当前数据库。
  • 另一个选择是使db处于单用户模式。&gt;&gt;它会杀死所有其他用户进程
  • 使用ROLLBACK IMMEDIATE设置OFFLINE。它将使db处于脱机模式并将其恢复
  • 使用sp_who2来了解使用当前数据库的用户。并杀死所需的spid

答案 8 :(得分:0)

如果您打开的SQL文件先前已查询过您要删除的数据库,则会阻止丢弃。如上所述。为我解决这些已解决的问题

答案 9 :(得分:0)

使用Sql Server Management Studio时遇到了这种类型的问题。经过多天的谷歌搜索和实验,我终于找到了一个问题。

注意:你应该首先为这个表创建一个drop并创建表脚本,如果不是你就不会有你的表

1 - 首先只创建属于他们相应外键的表。

2 - 使用这些表创建可视化图表(Sql express-Databases-Databasename-DataBase Diagram-右键单击它并选择新的数据库图表)

3 - 在图表上添加所需的数据表,并在创建表格期间添加相应的外键,创建这些数据表之间的关系

4 - 然后保存了数据库

如果您忘记在数据表中添加给定字段,可以轻松删除并创建数据表,为此,请按照以下步骤操作:

1 - 打开相应数据库的数据库图表

2 - 删除要添加某个字段的旧表与其他表之间存在的所有关系

3 - 然后从图中删除相应的表(右键单击表,然后从数据表中选择删除表)

4 - 保存图表(Ctrl + S)

5 - 转到要删除的表并创建

6 - 右键单击​​表并选择(脚本表,然后选择drop并创建然后转到新的查询编辑器窗口),这将在新表中编写脚本脚本,此时您可以根据需要对其进行修改,例如,旧的和新的同桌

旧表

        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

然后在修改后的数据表的页面中,按执行。它将不会第一次执行并将写入遇到的一些错误,但不关心并且只是在第二次按下Execute。此时,它将在文档底部执行并写入成功消息。然后选择数据库并单击Refresh(或按F5),他将更新某些计算机中的数据库表或者您需要重新启动程序在其他计算机上查看更新之前(我不知道为什么,所以不要让我解释)。

现在回到图表并更新更新的表格,然后将这些(这个)表格连接到与它有任何关系的表格。

希望这会节省某些人的时间。

我不

答案 10 :(得分: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)

如果有许多进程正在使用数据库,您只需多次运行。

答案 11 :(得分:0)

这里完全随机的想法。但是,如果您在Visual Studio中打开了一个SQL DB项目,即使您没有采取任何操作或在SSMS中打开查询窗口,它的开放性也会占用进程。

这是我的问题。完全关闭Visual Studio,允许我删除数据库,没有问题。

答案 12 :(得分:0)

对于Linux,请尝试重新启动mssql.server

sudo systctl mssql-server.service

然后 DROP Databse "DatabseName"

答案 13 :(得分:0)

如果在通过ADO.NET和SqlConnection与数据库进行编程交互之后遇到了这种情况,并且您确定在使用后已经关闭了每个连接,并且那里确实没有其他人,您可能会被连接池绊倒。在连接到master或另一个数据库以对数据库发出DROP DATABASE命令之前,请尝试以下C#代码清除池:

SqlConnection.ClearPool(yourSqlConnectionObject);