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.
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
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.
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.
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
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 .....
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
En plus de la réponse de mr_Eclair ci-dessus, j'aimerais ajouter:
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.
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.
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
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.