53

我正在使用 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方法来阻止选择数据库时出现的一些问题。

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

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

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

4

14 回答 14

75

如果您打开了任何连接到该数据库的查询窗口,我们通常会收到此错误,因此请确保关闭所有打开的连接到您要删除的 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并检查 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
于 2012-10-03T05:56:29.777 回答
56
  1. 右键单击数据库并选择“删除”(或左键单击它并按“删除”键)。
  2. 当“删除对象”对话框出现时,确保选中“关闭现有连接”(见下文,默认情况下未选中)。
  3. “确定”

在此处输入图像描述

于 2013-04-01T09:10:23.943 回答
32

试试这个:

use master;
GO

ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

GO
.....

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

于 2012-10-03T05:51:59.837 回答
6
ALTER DATABASE test1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE

ALTER DATABASE test1 SET OFFLINE;

DROP DATABASE test1

在存储过程中试试这个

于 2014-06-12T07:23:06.320 回答
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 的值来自上一个查询。

于 2013-11-12T14:02:29.777 回答
1

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

希望,它会工作......

于 2012-10-03T05:50:39.043 回答
1

如果您在通过 ADO.NET 和 以编程方式与数据库交互后遇到此问题SqlConnection,并且您确定您在使用后关闭了每个连接,并且那里真的没有其他人,您可能会被绊倒连接池。尝试使用此 C# 代码在连接到master或另一个数据库之前清除池以在您的数据库上发出DROP DATABASE命令:

SqlConnection.ClearPool(yourSqlConnectionObject);
于 2019-06-04T17:57:56.907 回答
0

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

于 2013-12-11T06:22:20.647 回答
0

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

  • 在选择当前数据库的位置必须关闭所有查询窗口。
  • 另一种选择是使数据库处于单用户模式。>>它将杀死所有其他用户进程
  • 立即回滚设置离线。它将使数据库处于离线模式并将其恢复
  • 使用 sp_who2 了解使用当前数据库的用户。并杀死所需的 spid
于 2014-03-05T19:13:32.673 回答
0

如果您打开了之前查询过您尝试删除的数据库的 SQL 文件,这些文件将阻止删除。如上所述。为我关闭这些已解决的问题

于 2014-06-10T14:37:43.923 回答
0

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

注意:你应该首先为这个表创建一个 drop 和 create table 脚本,否则你将没有你的表

1-首先只用它们对应的外键创建你的表。

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

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

4-然后保存您的数据库

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

1-打开对应数据库的Database图

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页面,按Execute。它不会第一次执行,会写一些遇到的错误,但不要在意,第二次按执行即可。这时它会执行并在文档底部写入成功信息。然后选择数据库并单击刷新(或按F5),他将更新您的数据库在某台计算机上的表,否则您将需要重新启动程序在其他电脑上看到更新之前(我不知道为什么,所以不要让我解释)。

现在返回图表并 dd 更新的表,然后将这些(此)表连接到与其有任何关系的表。

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

我不

于 2016-10-11T09:24:17.423 回答
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)

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

于 2017-02-26T11:39:19.313 回答
0

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

这就是我的问题。完全关闭 Visual Studio,让我可以毫无问题地删除数据库。

于 2017-05-03T17:05:11.160 回答
0

对于 linux 尝试重新启动 mssql.server

sudo systctl mssql-server.service

然后 DROP Databse "DatabseName"

于 2019-05-03T13:35:55.253 回答