无法在sql server中删除和创build数据库
我正在使用SQL Server 2008,似乎无法删除并创build数据库。
我尝试了几种不同的方法,但是我最终总是失败,或者在创build之前尝试“使用”。
我目前的尝试是这样的。
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
作为阻止select数据库时发生的一些问题的一种方法。
有了这个我目前得到的输出(与现有的同名数据库):
消息3702,级别16,状态4,行3
不能放弃数据库“testing”,因为它目前正在使用。
Ms1801,Level 16,State 3,Line 1
数据库'testing'已经存在。 select不同的数据库名称。
消息2714,级别16,状态6,2号线
数据库中已经有一个名为“staff_type”的对象。
最后2行重复我的数据库中的每个表。
我们通常会得到这个错误如果你已经打开了任何查询窗口连接到这个数据库,所以确保你closures所有打开的查询窗口连接到你试图删除数据库。
不要使用您要删除的数据库。 使用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 kill process 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
- 右键单击数据库并select“删除” (或者左键单击并按“del”键)。
- 当出现“删除对象”对话框时,请确保选中“closures现有连接” (请参阅下面的说明,默认为未选中)。
- 按“确定” 。
尝试这个:
use master; GO ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO .....
这将回滚在该数据库上运行的所有事务,并将SQL Server数据库置于单用户模式。
这将给你所有的当前连接:
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的值来自之前的查询。
如果您在使用Master时遇到上述错误。 那么你需要完全closuresSQL Server Management Studio
并再次打开并连接到它并运行你的上面的查询…..
希望,它会工作…..
ALTER DATABASE test1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE test1 SET OFFLINE;
DROP DATABASE test1
试试这里面的存储过程
您需要使用此数据库closures所有查询窗口,也可能需要完全重新启动SQL Server。 这可能会解决你的问题。
如果您打开的SQL文件以前曾经查询过您尝试删除的数据库,则这些数据将会阻止丢弃。 如上所述。 为我解决这些已解决的问题
除了上面的mr_eclair的回答,我想补充一下:
- 所有查询窗口必须在select了currect db的地方closures。
- 另一个选项是使数据库处于单用户模式。>>它会杀死所有其他用户进程
- 设置OFFLINE WITH ROLLBACK IMMEDIATE。 它会使数据库处于离线模式并将其恢复
- 使用sp_who2来了解使用当前数据库的用户。 并杀死所需的spids
在使用Sql Server Management Studio时遇到这种types的问题。 经过多天的search和实验,我终于find了一个问题。
注意:你应该首先创build一个drop,并为这个表创build表脚本,如果没有,你将不会有你的表
1 – 首先创build只有你的表与他们相应的外键。
2 – 用这些表创build一个可视化图(Sql express-Databases-Databasename-DataBase Diagram-右键点击它并select新的数据库图)
3 – 在图中添加所需的数据表,并在创build表时添加这些数据表与添加的相应外键的关系
4 – 然后保存您的数据库
如果您忘记在数据表中添加给定的字段,可以轻松地删除并创build数据表,为此,请执行以下步骤:
1-打开相应数据库的数据库图表
2-删除要添加字段和其他表的旧表之间存在的所有关系
3 – 然后从图中删除相应的表(右键单击表,然后从数据表中select删除表)
4 – 保存图(Ctrl + S)
5,转到您想要放置并创build的表格
6 – 右键单击表格并select(脚本表作为然后select下拉和创build,然后去新的查询编辑器窗口),这将脚本您的表在新的表,这时您能修改它到您的需要,例证和旧的和新的同一张桌子
老表
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
然后在修改的数据表的页面中,按执行。 它不会执行第一次,会写一些遇到的错误,但不关心,只是按第二次执行。 此时,它会在文档的底部执行并写入成功消息。然后select数据库并单击刷新(或按F5键),他将在某台计算机上更新数据库的表格,或者需要重新启动程序之前在别人的电脑上更新(我不知道为什么,所以不要问我解释)。
现在回到图表中,并更新已更新的表格,然后将这些(这个)表格连接到与之有任何关系的表格。
希望这会节省一些人的时间。
我不知道
我知道我已经迟到了。 但是,这就是我如何一步到位 。 这是经常发生的事情,我不想在很多步骤中这样做,所以我把它合并到一个步骤。
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)
如果有很多使用数据库的进程,你只需要多次运行这个进程。
这里完全是随意的想法。 但是,如果您在Visual Studio中打开了一个SQL DB项目,即使您没有采取任何操作或在SSMS中打开查询窗口,它的开放性也将占用进程。
这是我的情况。 完全closuresVisual Studio,允许我放下数据库没有问题。