2012-10-03 24 views
43

में डेटाबेस ड्रॉप और बनाने में असमर्थ मैं SQL Server 2008 के साथ काम कर रहा हूं और मुझे ड्रॉप करने और डेटाबेस बनाने की प्रतीत नहीं होती है।एसक्यूएल सर्वर

मैंने कुछ अलग तरीकों की कोशिश की है, लेकिन मैं हमेशा इसे छोड़ने या "उपयोग" करने की कोशिश करने से पहले विफल होने में विफल रहता हूं।

मेरा वर्तमान प्रयास इस तरह दिखता है।

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 कुछ मुद्दों है कि हो जब डेटाबेस का चयन को रोकने के लिए एक रास्ता के रूप में एक एमएस मंच पर सुझाव दिया गया था।

संदेश 3702, स्तर 16, राज्य 4, लाइन 3
नहीं छोड़ा जा सकता डेटाबेस "परीक्षण" है क्योंकि:

इस के साथ

मैं वर्तमान की (एक ही नाम के एक अयस्क मौजूदा डेटाबेस के साथ) आउटपुट प्राप्त यह वर्तमान में उपयोग में है।
संदेश 1801, स्तर 16, राज्य 3, रेखा 1
डेटाबेस 'परीक्षण' पहले से मौजूद है। एक अलग डेटाबेस नाम चुनें।
संदेश 2714, स्तर 16, राज्य 6, रेखा 2
डेटाबेस में 'staff_type' नामक एक वस्तु पहले से ही है।

पिछले 2 लाइनों के साथ मेरे डेटाबेस में प्रत्येक तालिका के लिए दोहराया गया है।

उत्तर

61

हमें आमतौर पर यह त्रुटि मिलती है यदि आपने इस डेटाबेस के कनेक्शन के साथ कोई क्वेरी विंडो खोला है, तो सुनिश्चित करें कि आप अपनी सभी खुली क्वेरी विंडो को डीबी से कनेक्ट कर चुके हैं जिसे आप छोड़ने की कोशिश कर रहे हैं।

डेटाबेस का उपयोग न करें जिसे आप छोड़ने का प्रयास कर रहे हैं। एक अच्छा अभ्यास है कि किसी भी उपयोगकर्ता डेटाबेस ड्रॉप करने के लिए मास्टर का उपयोग करें।

सुनिश्चित करें कि आप जिस डेटाबेस को छोड़ने की कोशिश कर रहे हैं, उससे कोई अन्य प्रक्रिया संलग्न नहीं है।

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 
+1

एक प्रक्रिया इसे पकड़ रही थी। धन्यवाद। – TrewTzu

+0

@TrewTzu आपकी मदद करने में खुश है :) –

+3

[this] (http://stackoverflow.com/a/13672187/2545927) के साथ संयोजन में यह जवाब मेरे लिए किया। – kkuilla

1

यदि मास्टर का उपयोग करते समय आपको उपरोक्त त्रुटि मिल रही है। तो आप पूरी तरह से बंद करने के लिए SQL Server Management Studio और इसे फिर से खोलने के लिए और यह करने के लिए कनेक्ट करने और अपने ऊपर क्वेरी चलाने .....

आशा की जरूरत है, यह काम करता है .....

28

इस कोशिश करता हूँ:

use master; 
GO 

ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 

GO 
..... 

यह उस डेटाबेस पर चल रहे किसी भी लेनदेन को रोलबैक करेगा और SQL सर्वर डेटाबेस को एक एकल उपयोगकर्ता मोड में लाएगा।

+0

क्या आप अपनी क्वेरी को थोड़ा सा समझा सकते हैं? –

+1

@LolCoder: यह उस डेटाबेस पर चल रहे किसी लेनदेन को रोलबैक करेगा और SQL सर्वर डेटाबेस को एक एकल उपयोगकर्ता मोड में लाएगा। –

+1

यह दृष्टिकोण बहुत बेहतर है। यह भी चर्चा की गई [यहां] (http://stackoverflow.com/questions/1711840/how-do-i- स्पेसिफी- क्लोज़- एक्सस्टिंग- कनेक्शन-in-sql- स्क्रिप्ट)। – dmigo

39
  1. राइट क्लिक करें और चयन "हटाएँ" (या इसे छोड़ दिया क्लिक करें और 'डेल' कुंजी दबाएँ)।
  2. जब 'ऑब्जेक्ट हटाएं' संवाद प्रकट होता है, तो सुनिश्चित करें कि "मौजूदा कनेक्शन बंद करें" (नीचे देखें, यह डिफ़ॉल्ट रूप से अनचेक है)।
  3. प्रेस "ठीक है"

enter image description here

+3

सरल तरीका, धन्यवाद! +1 –

+0

मुझे विश्वास नहीं है कि मुझे एसक्यूएल सर्वर का उपयोग करने के वर्षों के बाद यह मिला। – ilans

3

यह आपको सभी मौजूदा कनेक्शन दे देंगे:

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

तो फिर तुम मार @spid निष्पादित करने के लिए है, जहां @spid के लिए मूल्य से है एक टी एसक्यूएल कर्सर इस्तेमाल कर सकते हैं पिछली क्वेरी

0

आपको इस डेटाबेस का उपयोग कर सभी क्वेरी विंडो को बंद करने की आवश्यकता है, आपको SQL सर्वर को पूरी तरह से पुनरारंभ करने की आवश्यकता हो सकती है। यह आपकी समस्या का समाधान कर सकता है।

0

ऊपर mr_eclair के जवाब के साथ साथ, मैं जोड़ना चाहते हैं: जहां currect db चयन किया जाता है

  • सभी क्वेरी विंडो बंद किया जाना चाहिए।
  • एक और विकल्प डीबी को एकल उपयोगकर्ता मोड में बना देता है। >> यह अन्य सभी उपयोगकर्ताओं की प्रक्रियाओं को मार देगा
  • रोलबैक तत्काल के साथ ऑफलाइन सेट करें। यह डीबी को ऑफ़लाइन मोड में बना देगा और इसे
  • वर्तमान डीबी का उपयोग करने वाले उपयोगकर्ताओं को जानने के लिए sp_who2 का उपयोग करेगा। और आवश्यक स्पिड्स को मारना
0

यदि आपके पास एसक्यूएल फाइलें खुली हैं जो पहले डीबी पूछती हैं तो आप ड्रॉप करने की कोशिश कर रहे हैं, ये ड्रॉप को रोक देंगे। ऊपर उल्लेख के रूप में। के लिए मुझे

1
ALTER DATABASE test1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

ALTER DATABASE test1 SET OFFLINE; 

DROP DATABASE test1 

इन का समाधान मुद्दा बंद करने से यह अंदर संग्रहित प्रक्रिया

0

मैं जब Sql सर्वर प्रबंधन स्टूडियो के साथ काम कर इस प्रकार की समस्या का सामना करना पड़ा का प्रयास करें। गुगलिंग और प्रयोगों के कई दिनों बाद, मुझे अंततः एक मुद्दा मिला।

एनबी: आप सबसे पहले एक बूंद बना सकते हैं और इस तालिका के लिए तालिका स्क्रिप्ट बनाने के लिए, यदि आप अपने तालिका

1-सबसे पहले सिर्फ तुम्हारा उनकी coresponding विदेशी कुंजी के साथ टेबल बना नहीं होगा नहीं चाहिए।

इन टेबल के साथ एक दृश्य चित्र 2-बनाएं (SQL व्यक्त-डेटाबेस-DatabaseName-डेटाबेस उस पर आरेख-राइट क्लिक करें और नया डेटाबेस आरेख)

3-जोड़े चित्र पर आवश्यक datatables और संबंध बनाने टेबल

के निर्माण

के दौरान जोड़े इसी विदेशी कुंजी के साथ इन datatables के बीच 4-फिर अपने डेटाबेस

बचाया मामले आप एक datatable में दिए गए फ़ील्ड जोड़ना भूल है कि में, आप आसानी ड्रॉप और बना सकते हैं अपने डेटाटेबल्स, ऐसा करने के लिए, इन चरणों का पालन करें:

1-ओपन इसी डेटाबेस का डाटाबेस आरेख

2-हटाना सभी रिश्तों जो पुराने तालिका के बीच मौजूद है कि आपकी कुछ क्षेत्र जोड़ना चाहते हैं और दूसरों टेबल

3-फिर हटाएं आरेख से इसी तालिका (सही मेज पर क्लिक करें, फिर datatable से तालिका को हटाने का चयन करें)

4-सहेजें आरेख (Ctrl + S)

5-जाना मेज है कि आप ड्रॉप और बनाना चाहते हैं

6-तालिका पर राइट क्लिक करें और चुनें (स्क्रिप्ट तालिका के रूप में तब ड्रॉप ड्रॉप करें और फिर नई क्वेरी संपादक विंडो पर जाएं), यह आपकी तालिका को नई तालिका में स्क्रिप्ट करेगा, इस समय आप इसे अपनी आवश्यकता के अनुसार संशोधित कर सकते हैं, साथ और पुराने और नए एक ही मेज

ओल्ड तालिका उदाहरण

 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 

फिर साथ नव उसी तालिका के पेज में संशोधित डेटाटेबल, निष्पादन दबाएं। यह पहली बार निष्पादित नहीं होगा और कुछ त्रुटियों को सामने आएगा, लेकिन परवाह नहीं है और दूसरी बार निष्पादन दबाएं। इस समय, यह दस्तावेज़ के निचले हिस्से में सफलता संदेश निष्पादित करेगा और लिख देगा। फिर डेटाबेस का चयन करें और रीफ्रेश (या F5 दबाएं) पर क्लिक करें, वह कुछ कंप्यूटर में आपके डेटाबेस की टेबल अपडेट करेगा या आपको प्रोग्राम को पुनरारंभ करना होगा अन्य कंप्यूटरों में अद्यतनों को बैठने से पहले (मुझे नहीं पता क्यों, इसलिए मुझे समझाने के लिए मत कहें)।

अब आरेख पर वापस जाएं और अपडेट की गई तालिका को डीडी करें और फिर इन (इस) तालिका को उन तालिकाओं से कनेक्ट करें जिनके साथ कोई संबंध है।

आशा है कि यह किसी के समय को बचाएगा।

मैं

0

डॉन मैं मैं खेल के लिए देर से पता है। लेकिन यहां मैं एक चरण में ऐसा कैसे करता हूं। यह अक्सर हो रहा था मैं कई चरणों में ऐसा नहीं करना चाहता था इसलिए मैंने इसे एक ही चरण में जोड़ा।

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) 

यदि डेटाबेस का उपयोग कर रहे कई प्रक्रियाएं हैं तो आपको बस इसे कई बार चलाने होंगे।

0

पूरी तरह यादृच्छिक विचार यहां।लेकिन अगर आपके पास विजुअल स्टूडियो में एक एसक्यूएल डीबी प्रोजेक्ट खुला है, तो इसकी ओपन-नेस प्रक्रियाओं पर कब्जा कर लेगी भले ही आप कोई कार्रवाई नहीं कर रहे हों या एसएसएमएस में खुली क्वेरी विंडो न हों।

यह मेरे मामले में मुद्दा था। विजुअल स्टूडियो को पूरी तरह बंद करना, मुझे बिना किसी समस्या के डेटाबेस छोड़ने की अनुमति दी।

संबंधित मुद्दे