2012-10-03 17 views
43

Estoy trabajando con SQL Server 2008 y parece que no puedo soltar y crear una base de datos.no se puede colocar y crear la base de datos en el servidor sql

He intentado de diferentes maneras, pero siempre termino fallando o tratando de "usar" antes de que parezca que se creó.

Mi intento actual se ve así.

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 

El GO fueron sugeridos en un foro de la EM como una forma de evitar que algunos problemas que se producen cuando se seleccionan las bases de datos.

Con esta actualmente consigo la salida (con una base de datos existente de mineral del mismo nombre) de:

Msg 3702, nivel 16, estado 4, Línea 3
No se puede quitar "prueba" base de datos porque está actualmente en uso.
Msg 1801, nivel 16, estado 3, línea 1
La base de datos 'prueba' ya existe. Elija un nombre de base de datos diferente.
Msg 2714, nivel 16, estado 6, línea 2
Ya existe un objeto llamado 'staff_type' en la base de datos.

Con las 2 últimas líneas repetidas para cada tabla en mi base de datos.

Respuesta

61

Por lo general, obtenemos este error Si ha abierto cualquier ventana de consulta con conexión a esta base de datos, asegúrese de cerrar todas las ventanas de consulta abiertas conectadas a db que está intentando eliminar.

No utilice la base de datos que está intentando eliminar. use master para eliminar cualquier base de datos de usuarios que sea una buena práctica.

Asegúrate de que no hay ningún otro proceso conectado a la base de datos que intentas eliminar.

EXEC sp_who2 
--Run kill spid for each process that is using the database to be dropped. 
kill <<processid>> -- Kill 57 

Uso EXEC sp_who2 y compruebe la columna DBName, su nombre de la base de datos no debe aparecer en la lista, si aparece matar el proceso usando kill <<processid>> luego tratar de soltar.

Pruebe este código.

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

un proceso se estaba sosteniendo. Gracias. – TrewTzu

+0

@TrewTzu Feliz de ayudarte :) –

+3

Esta respuesta en combinación con [esto] (http://stackoverflow.com/a/13672187/2545927) lo hizo por mí. – kkuilla

1

Si obtiene el error anterior al utilizar el Máster. entonces usted necesita para cerrar SQL Server Management Studio por completo y volver abrirlo y conectarse a él y ejecutar su consulta anterior .....

Esperanza, que va a las obras .....

28

intente esto:

use master; 
GO 

ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 

GO 
..... 

Esto revertirá cualquier transacción que se ejecute en esa base de datos y traerá la base de datos de SQL Server en un modo de usuario único.

+0

¿Podría explicar un poco su consulta? –

+1

@LolCoder: Esto revertirá cualquier transacción que se ejecute en esa base de datos y traerá la base de datos de SQL Server en un modo de usuario único. –

+1

Este enfoque es mucho mejor. También se discutió [aquí] (http://stackoverflow.com/questions/1711840/how-do-i-specify-close-existing-connections-in-sql-script). – dmigo

39
  1. Haga clic derecho en la base de datos y seleccione "Borrar" (oa la izquierda clic en él y pulse la tecla 'del').
  2. Cuando aparezca el cuadro de diálogo 'Eliminar objeto', asegúrese de marcar "Cerrar conexiones existentes" (ver más abajo, está desmarcado de manera predeterminada).
  3. Presione "OK".

enter image description here

+3

¡La manera más simple, gracias! +1 –

+0

No puedo creer que encontré esto después de años de usar Sql Server. – ilans

3

Esto le dará todas las conexiones actuales:

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

A continuación, se puede utilizar un cursor de T-SQL para ejecutar @SPID matanza, donde el valor de @SPID es de la consulta anterior.

0

Debe cerrar toda la ventana de consulta utilizando esta base de datos, también es posible que deba reiniciar por completo el servidor SQL. Esto podría resolver su problema.

0

Junto con la respuesta de mr_eclair anterior, me gustaría añadir:

  • ventana Toda consulta debe estar cerrada cuando se selecciona el PP currect.
  • Otra opción es hacer que la base de datos esté en el modo de usuario único. >> matará a todos los demás procesos de los usuarios
  • establezca OFFLINE WITH ROLLBACK INMEDIATE. hará que el db esté en modo fuera de línea y lo devuelva
  • use sp_who2 para conocer a los usuarios que usan el db actual. y matar a los spids necesarios
0

Si tiene archivos SQL abiertos que hayan consultado previamente la base de datos que está intentando eliminar, estos impedirán que caigan. Como se menciona arriba. Cerrar estas problema resuelto para mí

1
ALTER DATABASE test1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

ALTER DATABASE test1 SET OFFLINE; 

DROP DATABASE test1 

Prueba este procedimiento almacenado en el interior

0

me enfrentaba a este tipo de problemas cuando se trabaja con SQL Server Management Studio. Después de muchos días de buscar en Google y experimentar, finalmente encontré un problema.

Nota: Usted debe crear en primer lugar una caída y crear script de tabla para esta tabla, si no que no tendrá su mesa

1-En primer lugar crear solo tuya tablas con claves externas coresponding suyos.

2-Crear un diagrama visual con estas tablas (SQL Express-Bases de datos-Databasename-Base de datos Diagrama-clic derecho sobre él y seleccione nuevo diagrama de base de datos)

3-Añadir las tablas de datos requeridos en el diagrama y crear la relación entre estas tablas de datos con claves externas correspondientes agregados durante la creación de tablas

4-Luego salvó su base de datos

en el caso de que usted tiene olvide añadir un campo determinado en una tabla de datos, se puede eliminar y crear fácilmente su tablas de datos, para ello, siga estos pasos:

1-Abrir el diagrama de base de datos de la base de datos correspondiente

2-borrar todas las relaciones que existen entre la vieja tabla a la que desea agregar un poco de campo y otras mesas

3-a continuación, eliminar el tabla correspondiente del diagrama (haga clic derecho en la tabla, a continuación, seleccione eliminar tabla de la tabla de datos)

4-Guardar el diagrama (Ctrl + S)

5-ir a la tabla que desea colocar y crear

6-Haga clic con el botón derecho en la tabla y seleccione (Tabla de scripts como luego seleccione soltar y crear y luego vaya a las nuevas ventanas del editor de consultas), esto creará su tabla en la nueva tabla, en este momento puede modificarla según su necesidad, ejemplo con y viejo y nuevo misma mesa

Vector viejo

 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 

ahora los nuevos misma mesa con 3 nUEVOS CAMPOS (correo electrónico, imagen y sal)

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 

Luego, en la página de la Datatable modificado, Presione Ejecutar. No se ejecutará por primera vez y escribirá algunos errores encontrados, pero no importa y solo presiona Ejecutar por segunda vez. En este momento, ejecutará y escribirá el mensaje de éxito en la parte inferior del documento. Luego seleccione la base de datos y haga clic en Actualizar (o presione F5), actualizará las tablas de su Base de datos en alguna computadora o tendrá que reiniciar el programa. antes de ver las actualizaciones en otras computadoras (no sé por qué, así que no me pidas explicaciones).

Regrese ahora al diagrama y a la tabla actualizada y luego conecte estas (esta) tabla (s) a las tablas que tengan alguna relación con ella.

Espero que esto ahorrará el tiempo de alguien.

I don

0

Sé que estoy tarde para el juego. Pero aquí está cómo hago esto en un paso. Esto sucedía tan a menudo que no quería hacer esto en muchos pasos, así que lo combiné en un solo paso.

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) 

Si hay muchos procesos que utilizan la base de datos you'll sólo hay que ejecutarlo varias veces.

0

pensamiento totalmente aleatorio aquí.Pero si tiene un proyecto SQL DB abierto en Visual Studio, su apertura ocupará procesos incluso si no está realizando ninguna acción o tiene ventanas de consulta abiertas en SSMS.

Este fue el problema en mi caso. Cerrar Visual Studio por completo, me permitió eliminar la base de datos sin problemas.

Cuestiones relacionadas