Невозможно удалить и создать базу данных на сервере sql
Я работаю с SQL Server 2008, и я не могу сделать drop и создать базу данных.
Я пробовал несколько разных способов, но я всегда заканчиваю тем, что не мог отказаться или попытаться "использовать", прежде чем он, кажется, будет создан.
Моя текущая попытка выглядит так.
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 как способ остановить некоторые проблемы, возникающие при выборе баз данных.
С этим я в настоящее время получаю вывод (с существующей базой данных с таким же именем):
Msg 3702, уровень 16, состояние 4, строка 3
Невозможно удалить базу данных "test", потому что она в настоящее время используется.
Msg 1801, уровень 16, состояние 3, строка 1
База данных "тест" уже существует. Выберите другое имя базы данных. Msg 2714, уровень 16, состояние 6, строка 2
В базе данных уже есть объект с именем "staff_type".
Если последние две строки повторяются для каждой таблицы в моей базе данных.
Ответы
Ответ 1
Обычно мы получаем эту ошибку. Если вы открыли любое окно запроса с подключением к этой базе данных, убедитесь, что вы закрыли все открытые окна запросов, связанные с 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
Ответ 2
- Щелкните правой кнопкой мыши по базе данных и выберите "Удалить" (или щелкните левой кнопкой мыши и нажмите клавишу "del" ).
- Когда появится диалоговое окно "Удалить объект", убедитесь, что вы отметили "Закрыть существующие соединения" (см. ниже, он по умолчанию не установлен).
- Нажмите "ОК" .
![enter image description here]()
Ответ 3
попробуйте следующее:
use master;
GO
ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
.....
Это приведет к откату любой транзакции, которая выполняется в этой базе данных, и приносит базу данных SQL Server в однопользовательском режиме.
Ответ 4
Это даст вам все текущие подключения:
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 относится к предыдущему запросу.
Ответ 5
ALTER DATABASE test1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE test1 SET OFFLINE;
DROP DATABASE test1
Попробуйте это внутри хранимой процедуры
Ответ 6
Если вы получаете указанную выше ошибку при использовании Мастера. то вам нужно полностью закрыть SQL Server Management Studio
и снова открыть его и подключиться к нему и выполнить свой предыдущий запрос.....
Надеюсь, это сработает.....
Ответ 7
Вам нужно закрыть все окно запроса с помощью этой базы данных, и вам может потребоваться полностью перезапустить SQL Server. Это может решить вашу проблему.
Ответ 8
Наряду с ответом mr_eclair выше, я хотел бы добавить:
- Окно "Все запросы" должно быть закрыто, когда выбран правильный номер.
- Другой вариант - сделать db в однопользовательском режиме. → он убьет все остальные процессы пользователей.
- установите OFFLINE WITH ROLLBACK IMMEDIATE. он сделает db в автономном режиме и вернет его.
- используйте sp_who2, чтобы узнать пользователей, использующих текущий db. и убить необходимые штифты.
Ответ 9
Если у вас есть файлы SQL, которые ранее запрашивали DB, которые вы пытаетесь удалить, это предотвратит падение. Как упоминалось выше. Закрытие этой разрешенной проблемы для меня
Ответ 10
Я столкнулся с такой проблемой при работе с Sql Server Management Studio. После многих дней поиска и экспериментов я наконец нашел проблему.
Примечание. Сначала вы должны создать drop и создать таблицу script для этой таблицы, если вы не будете иметь свою таблицу
1-Сначала создайте только ваши таблицы с их соответствующими внешними ключами.
2 - Создайте визуальную диаграмму с этой таблицей (Sql express-Databases-Databasename-DataBase Diagram - щелкните правой кнопкой мыши по ней и выберите новую диаграмму базы данных)
3. Добавьте необходимые диаграммы на диаграмму и создайте связь между этими данными с соответствующими внешними ключами, добавленными при создании таблиц.
4 - Затем сохранили вашу базу данных
В случае, если вы забыли добавить заданное поле в datatable, вы можете легко отбросить и создать свои данные, чтобы сделать это, выполните следующие действия:
1 - Откройте диаграмму базы данных соответствующей базы данных
2-удалить все отношения, которые существуют между старой таблицей, в которую вы хотите добавить некоторые поля и другие таблицы
3 - затем удалите соответствующую таблицу из диаграммы (щелкните правой кнопкой мыши по таблице, затем выберите удалить таблицу из данных)
4-Сохраните диаграмму (Ctrl + S)
5-перейти к таблице, которую вы хотите удалить, и создать
6 Щелкните правой кнопкой мыши по таблице и выберите (script таблицу, а затем выберите drop and create, затем перейдите в новые окна редактора Query), это будет script ваша таблица в новой таблице, в это время вы можете ее изменить к вашей потребности, пример и старая и новая та же таблица
Старый стол
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 нажмите "Выполнить". Он не будет выполняться в первый раз и напишет некоторые возникшие ошибки, но все равно, и просто нажмите "Выполнить" во второй раз. В это время он выполнит и напишет сообщение об успешном завершении в нижней части документа. Затем выберите базу данных и нажмите "Обновить" (или нажмите F5), он обновит таблицы базы данных на каком-то компьютере или вам потребуется перезапустить программу прежде чем устанавливать обновления на других компьютерах (я не знаю, почему, поэтому не просите меня объяснить).
Вернитесь назад к диаграмме и dd обновленной таблице, а затем соедините эти (эти) таблицы с таблицами, имеющими какое-либо отношение к ней.
Надеюсь, что это сэкономит время кому-то.
Я не
Ответ 11
Я знаю, что я опаздываю в игру. Но вот как я делаю это в одном шаге. Это происходило так часто, что я не делал этого много раз, поэтому я объединил его с одним шагом.
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)
Если есть много процессов, которые используют базу данных, вам просто нужно будет запускать это несколько раз.
Ответ 12
Полностью случайная мысль здесь. Но если в Visual Studio открыт проект SQL DB, его открытость будет занимать процессы, даже если вы не предпринимаете никаких действий или не открываете окна запросов в SSMS.
Это было в моем случае. Закрытие Visual Studio полностью позволило мне отказаться от базы данных без проблем.
Ответ 13
Для Linux попробуйте перезапустить mssql.server
sudo systctl mssql-server.service
затем DROP Databse "DatabseName"
Ответ 14
Если вы столкнулись с этим после программного взаимодействия с базой данных через ADO.NET и SqlConnection
, и вы уверены, что закрыли каждое из ваших подключений после использования, и в действительности там никого больше нет, возможно, вас запутали путем объединения подключений. Попробуйте этот код С#, чтобы очистить пул перед подключением к master
или другой базе данных, чтобы выполнить команду DROP DATABASE
для вашей базы данных:
SqlConnection.ClearPool(yourSqlConnectionObject);