web-dev-qa-db-fra.com

impossible de déposer et de créer une base de données sur le serveur SQL

Je travaille avec SQL Server 2008 et je n'arrive pas à supprimer et créer une base de données.

J'ai essayé de différentes manières, mais je finis toujours par ne pas réussir à "utiliser" avant qu'il semble avoir été créé.

Ma tentative actuelle ressemble à ceci.

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

Les GO ont été suggérés sur un forum MS afin de résoudre certains problèmes pouvant survenir lors de la sélection de bases de données.

Avec cela, je reçois actuellement la sortie (avec une ou plusieurs bases de données du même nom) de:

Msg 3702, niveau 16, état 4, ligne 3
Impossible de supprimer la base de données "test" car elle est actuellement utilisée.
Msg 1801, niveau 16, état 3, ligne 1
La base de données 'test' existe déjà. Choisissez un nom de base de données différent.
Msg 2714, Niveau 16, Etat 6, Ligne 2
Il existe déjà un objet nommé 'staff_type' dans la base de données.

Avec les 2 dernières lignes répétées pour chaque table de ma base de données.

47
TrewTzu

Nous obtenons généralement cette erreur Si vous avez ouvert une fenêtre de requête avec une connexion à cette base de données, assurez-vous de fermer toutes les fenêtres de requête ouvertes connectées à la base de données que vous essayez de supprimer.

N'utilisez pas la base de données que vous essayez de supprimer. utilisez master pour supprimer toute base de données d’utilisateurs recommandée.

Assurez-vous qu'aucun autre processus n'est lié à la base de données que vous essayez de supprimer.

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

Utilisez EXEC sp_who2 et cochez la colonne DBName. Le nom de votre base de données ne doit pas apparaître dans la liste. S'il semble tuer le processus à l'aide de kill <<processid>>, essayez de le supprimer.

Essayez ce code.

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
69
mr_eclair
  1. Cliquez avec le bouton droit de la souris sur la base de données et sélectionnez "Supprimer" (ou cliquez dessus et appuyez sur la touche "Suppr").
  2. Lorsque la boîte de dialogue "Supprimer un objet" apparaît, assurez-vous de cocher "Fermer les connexions existantes" (voir ci-dessous, cette case n'est pas cochée par défaut).
  3. Appuyez sur "OK".

enter image description here

41
ury

essaye ça:

use master;
GO

ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

GO
.....

Cela annulera toute transaction en cours d'exécution sur cette base de données et amènera la base de données SQL Server en mode utilisateur unique.

30
Joe G Joseph

Cela vous donnera toutes les connexions actuelles:

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

Vous pouvez ensuite utiliser un curseur t-sql pour exécuter kill @spid, où la valeur de @spid provient de la requête précédente.

3
doubled
ALTER DATABASE test1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE

ALTER DATABASE test1 SET OFFLINE;

DROP DATABASE test1

Essayez cette procédure stockée à l'intérieur

3
Dileep

Si vous obtenez l'erreur ci-dessus lors de l'utilisation de Master. alors vous devez fermer SQL Server Management Studio complètement et l'ouvrir à nouveau et vous connecter et lancer la requête ci-dessus .....

J'espère que ça va marcher .....

1
Akash KC

J'ai rencontré ce type de problème lorsque je travaillais avec Sql Server Management Studio. Après plusieurs jours de recherches sur Google et d'expériences, j'ai finalement trouvé un problème.

NB: Vous devez d’abord créer un script drop et create table pour cette table, sinon vous n’auriez pas votre table

1-Créez d’abord vos tables avec leurs clés étrangères.

2-Créez un diagramme visuel avec cette table (Sql express-Databases-Databasename-DataBase Diagramme-Faites un clic droit dessus et sélectionnez le nouveau diagramme de base de données)

3-Ajouter les données requises sur le diagramme et créer la relation entre ces données avec les clés étrangères correspondantes ajoutées lors de la création des tables

4-Puis sauvegardé votre base de données

Dans le cas où vous avez oublié d'ajouter un champ donné dans un datatable, vous pouvez facilement supprimer et créer vos datatables. Pour ce faire, procédez comme suit:

1-Ouvrez le schéma de la base de données de la base de données correspondante

2-supprimer toutes les relations existant entre l'ancienne table à laquelle vous souhaitez ajouter des champs et d'autres tables

3-puis supprimez le tableau correspondant du diagramme (clic droit sur le tableau, puis sélectionnez supprimer le tableau du datatable)

4-Enregistrer le diagramme (Ctrl + S)

5-aller à la table que vous voulez supprimer et créer

6-Faites un clic droit sur la table et sélectionnez (Table de script comme puis sélectionnez déposer et créer puis allez dans les nouvelles fenêtres de l'éditeur de requête), cela va créer un script pour votre table dans une nouvelle table, vous pouvez alors le modifier selon vos besoins, exemple avec et ancien et nouveau même tableau

Vieille table 

        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

Maintenant la nouvelle table avec 3 nouveaux champs (Email, image et sel)

   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

Ensuite, dans la page du Datatable modifié, appuyez sur Exécuter. Il ne s'exécutera pas pour la première fois et écrira certaines erreurs rencontrées, mais ne vous en souciez pas et appuyez simplement sur Exécuter une seconde fois. À ce stade, il exécutera et écrira le message de réussite au bas du document. Ensuite, sélectionnez la base de données et cliquez sur Actualiser (ou appuyez sur F5), il mettra à jour les tables de votre base de données sur un ordinateur ou vous devrez redémarrer le programme. avant de voir les mises à jour sur d’autres ordinateurs (je ne sais pas pourquoi, alors ne me demandez pas de vous expliquer).

Retournez maintenant au diagramme et dd la table mise à jour, puis connectez cette (ces) table (s) aux tables qui ont une relation avec elle.

J'espère que cela sauvera le temps de certains.

Je ne

0
El camerounian

En plus de la réponse de mr_Eclair ci-dessus, j'aimerais ajouter:

  • Toutes les fenêtres de requête doivent être fermées là où la base de données currect est sélectionnée.
  • Une autre option est de créer la base de données en mode mono-utilisateur. >> Cela va tuer tous les processus des autres utilisateurs
  • définir OFFLINE AVEC ROLLBACK IMMEDIATE. il fera la base de données en mode hors ligne et le ramènera
  • utilisez sp_who2 pour connaître les utilisateurs qui utilisent la base de données actuelle. et tuer les spids requis
0
Samuel Joy

Pensée totalement aléatoire ici. Mais si vous avez un projet SQL DB ouvert dans Visual Studio, son ouverture occupera des processus, même si vous n’effectuez aucune action ou si vous avez des fenêtres de requête ouvertes dans SSMS.

C'était le problème dans mon cas. La fermeture complète de Visual Studio m'a permis de supprimer la base de données sans problème.

0
pimbrouwers

Je sais que je suis en retard au match. Mais voici comment je fais cela dans une étape . Cela se produisait si souvent que je ne voulais pas le faire en plusieurs étapes, alors je l'ai combiné en une seule étape.

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 de nombreux processus utilisent la base de données, il vous suffira de l'exécuter plusieurs fois. 

0
Sturla

Si vous avez des fichiers SQL ouverts qui ont précédemment interrogé la base de données que vous essayez de supprimer, ceux-ci empêcheront la suppression. Comme mentionné ci-dessus. Fermer ces problèmes résolus pour moi

0
moglimcgrath

Vous devez fermer toute la fenêtre de requête à l'aide de cette base de données et vous devrez peut-être redémarrer complètement SQL Server. Cela pourrait résoudre votre problème.

0
ashu