2012-10-03 15 views
43

Sto lavorando con SQL Server 2008 e non riesco a far cadere e creare un database.impossibile rilasciare e creare database nel server sql

Ho provato diversi modi, ma finisco sempre per non cadere o cercare di "usare" prima che sembri essere creato.

Il mio attuale tentativo si presenta così.

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 

Il GO sono stati suggeriti su un forum MS come un modo per fermare alcuni problemi che si verificano quando si seleziona i database.

Con questa Attualmente ottengo l'uscita (con un minerale di database esistente con lo stesso nome) di:

Msg 3702, livello 16, stato 4, Linea 3
Impossibile eliminare il database "test" perché è attualmente in uso.
messaggio 1801, livello 16, stato 3, riga 1
Il "test" del database esiste già. Scegli un nome di database diverso.
messaggio 2714, livello 16, stato 6, riga 2
Nel database esiste già un oggetto denominato "staff_type".

Con le ultime 2 righe ripetute per ogni tabella nel mio database.

risposta

61

Generalmente riceviamo questo errore Se hai aperto una finestra di query con connessione a questo database, assicurati di chiudere tutte le finestre di query aperte collegate a db che stai tentando di eliminare.

Non utilizzare il database che si sta tentando di eliminare. utilizzare il master per eliminare qualsiasi database utente che sia una buona pratica.

Assicurarsi che nessun altro processo sia collegato al database che si sta tentando di eliminare.

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

Usa EXEC sp_who2 e controllare la colonna DBName, il nome del database non dovrebbe apparire nella lista, se appare uccidere il processo utilizzando kill <<processid>> quindi provare a cadere.

Prova questo codice.

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 processo si stava trattenendo. Grazie. – TrewTzu

+0

@TrewTzu Felice di aiutarti :) –

+3

Questa risposta in combinazione con [questo] (http://stackoverflow.com/a/13672187/2545927) lo ha fatto per me. – kkuilla

1

Se si verifica l'errore sopra riportato durante l'utilizzo di Master. allora è necessario chiudere completamente SQL Server Management Studio e ancora aprirlo e connettersi ad esso ed eseguire la query sopra .....

Speranza, sarà opere .....

28

provare questo:

use master; 
GO 

ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 

GO 
..... 

In questo modo verrà eseguito il rollback di qualsiasi transazione in esecuzione su quel database e il database SQL Server verrà portato in una modalità utente singolo.

+0

Potresti spiegare un po 'la tua domanda? –

+1

@LolCoder: esegue il rollback di qualsiasi transazione in esecuzione su quel database e porta il database di SQL Server in una modalità utente singolo. –

+1

Questo approccio è molto meglio. È stato anche discusso [qui] (http://stackoverflow.com/questions/1711840/how-do-i-specify-close-existing-connections-in-sql-script). – dmigo

39
  1. destro del mouse sul database e selezionare "Elimina" (o di sinistra-clic su di esso e premere il tasto 'del').
  2. Quando viene visualizzata la finestra di dialogo "Elimina oggetto", assicurati di selezionare "Chiudi connessioni esistenti" (vedi sotto, è deselezionato per impostazione predefinita).
  3. Premere "OK".

enter image description here

+3

Il modo più semplice, grazie! +1 –

+0

Non riesco a credere di averlo trovato dopo anni di utilizzo di Sql Server. – ilans

3

Questo vi darà tutte le connessioni correnti:

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

allora si potrebbe utilizzare un cursore T-SQL per eseguire uccidere @spid, dove il valore per @spid è da la query precedente.

0

È necessario chiudere tutte le finestre di query utilizzando questo database, inoltre potrebbe essere necessario riavviare completamente SQL Server. Questo potrebbe risolvere il tuo problema.

0

Insieme con la risposta di mr_eclair sopra, vorrei aggiungere:

  • finestra Tutti Query deve essere chiuso in cui viene selezionato il db currect.
  • Un'altra opzione è rendere il db in modalità utente singolo. >> uccide tutti i processi degli altri utenti
  • impostato OFFLINE CON ROLLBACK IMMEDIATO. farà il db in modalità offline e lo riporterà
  • usa sp_who2 per conoscere gli utenti che usano il db corrente. e killthe required spids
0

Se si dispone di file SQL aperti che hanno interrogato in precedenza il DB che si sta tentando di eliminare, questi impediranno il rilascio. Come menzionato sopra. Chiusura questi problema risolto per me

1
ALTER DATABASE test1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

ALTER DATABASE test1 SET OFFLINE; 

DROP DATABASE test1 

Prova questo all'interno di stored procedure

0

ho dovuto affrontare questo tipo di problema quando si lavora con SQL Server Management Studio. Dopo molti giorni di googling e esperimenti, ho finalmente trovato un problema.

NB: Si dovrebbe creare innanzitutto una goccia e di creare script di tabella per questa tabella, se non non avrete il vostro tavolo

1-Innanzitutto creare solo tuo tabelle con chiavi esterne loro coresponding.

2-Creare un diagramma visivo con questi tabella (SQL Express-Database-Nomedatabase-DataBase Schema-click destro su di esso e selezionare nuovo diagramma di database)

3-Aggiungere le DataTable richiesti sul diagramma e creare la relazione tra questi DataTable con corrispondenti chiavi esterne aggiunte durante la creazione di tabelle

4 quindi salvato il database

nel caso in cui si deve dimenticare di aggiungere un determinato campo in un DataTable, si può facilmente cadere e creare il tuo datatables, per fare questo, attenersi alla seguente procedura:

1-Aprire lo schema del database del database corrispondente

2-eliminare tutte le relazioni che esistono tra la vecchia tabella a cui si desidera aggiungere un po 'di campo e altri tavoli

3 quindi eliminare il tabella corrispondente dal diagramma (tasto destro sul tavolo, quindi selezionare elimina tabella dal DataTable)

4-Salvare il diagramma (Ctrl + S)

5-andare al tavolo che si desidera eliminare e creare

6-Fare clic con il tasto destro del mouse sulla tabella e selezionare (Tabella degli script come quindi selezionare rilascia e creare, quindi passare a nuove finestre dell'editor di query), questo scripterà la tabella in una nuova tabella, in questo momento è possibile modificarla in base alle proprie esigenze, esempio con e lo stesso tavolo vecchio e nuovo

vecchia tabella

 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 

Ora la stessa tabella nUOVO cON 3 nuovi campi (email, Immagine e Salt)

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 

Poi nella pagina del Datatable modificato, Premere Esegui. Non verrà eseguito per la prima volta e scriverà alcuni errori incontrati, ma non importa e basta premere Esegui in una seconda volta. A questo punto, eseguirà e scriverà il messaggio di successo nella parte inferiore del documento. Quindi selezionare il database e fare clic su Aggiorna (o premere F5), aggiornerà le tabelle del database in alcuni computer o sarà necessario riavviare il programma prima di vedere gli aggiornamenti su altri computer (non so perché, quindi non chiedetemi di spiegare).

Torna ora al diagramma e dd la tabella aggiornata e quindi collega queste (queste) tabelle alle tabelle che hanno qualsiasi relazione con esso.

Spero che questo salverà il tempo di qualcuno.

I don

0

So sto in ritardo al gioco. Ma ecco come faccio questo in un passo. Questo accadeva così spesso che non volevo farlo in molti passaggi, quindi l'ho combinato in un unico passaggio.

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) 

Se ci sono molti processi che utilizzano il database di avrete modo resta che eseguire questo più volte.

0

Pensiero totalmente casuale qui.Ma se hai un progetto DB SQL aperto in Visual Studio, la sua apertura occuperà i processi anche se non stai eseguendo alcuna azione o hai finestre di query aperte in SSMS.

Questo era il problema nel mio caso. Chiudere completamente Visual Studio mi ha permesso di eliminare il database senza problemi.

Problemi correlati