Подтвердить что ты не робот

Невозможно удалить и создать базу данных на сервере 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".

Если последние две строки повторяются для каждой таблицы в моей базе данных.

4b9b3361

Ответ 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);