2009-11-10 11 views
120

में "मौजूदा कनेक्शन बंद करें" को कैसे निर्दिष्ट करूं मैं SQL Server 2008 में अपनी स्कीमा पर सक्रिय विकास कर रहा हूं और अक्सर अपनी ड्रॉप/डेटाबेस डेटाबेस स्क्रिप्ट को पुन: चालू करना चाहता हूं। जब मैंमैं एसक्यूएल स्क्रिप्ट

USE [master] 
GO 

IF EXISTS (SELECT name FROM sys.databases WHERE name = N'MyDatabase') 
DROP DATABASE [MyDatabase] 
GO 

चलाने मैं अक्सर इस त्रुटि

Msg 3702, Level 16, State 4, Line 3 
Cannot drop database "MyDatabase" because it is currently in use. 

मिल आप सही वस्तु एक्सप्लोरर फलक में डेटाबेस पर क्लिक करें और संदर्भ मेनू से हटाएं कार्य का चयन करते हैं, तो एक चेकबॉक्स है जो करने के लिए "मौजूदा कनेक्शन बंद करें"

क्या मेरी स्क्रिप्ट में इस विकल्प को निर्दिष्ट करने का कोई तरीका है?

उत्तर

189

आप हर किसी डिस्कनेक्ट करें और के साथ अपने लेनदेन वापस रोल कर सकते हैं:

alter database [MyDatbase] set single_user with rollback immediate 

उसके बाद, आप सुरक्षित रूप से डेटाबेस :)

+4

मैंने इसका उपयोग किया है लेकिन अक्सर यह सोचता है कि क्या किसी अन्य उपयोगकर्ता के लिए "एकल उपयोगकर्ता" के रूप में प्रवेश करने का मौका था - क्या यह संभव है? संभावित विकल्प वैकल्पिक डेटा है [MyDatabaseName] रोलबैक के साथ सेट ऑफ़लाइन तत्काल – Kristen

+7

एकल_user में उपयोगकर्ता आप हैं; जब तक आप एकल उपयोगकर्ता मोड सेट करने के बाद डिस्कनेक्ट नहीं करते। फिर एक (1) अन्य उपयोगकर्ता लॉग ऑन कर सकते हैं। – Andomar

+0

धन्यवाद; समझ में आता है। – Kristen

29

जाओ प्रबंधन स्टूडियो करने के लिए छोड़ और सब कुछ आप का वर्णन कर सकते हैं, के बजाय केवल ठीक क्लिक करके, स्क्रिप्ट पर क्लिक करें। यह उस कोड को दिखाएगा जो वह चलाएगा जिसे आप अपनी स्क्रिप्ट में शामिल कर सकते हैं।

इस मामले में, आप चाहते हैं:

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
+1

मैं जा रहा था जी आप जो भी वर्णन करते हैं, वही कर रहे हैं ("डेटाबेस हटाएं" संवाद को स्क्रिप्ट करके) इस प्रश्न का उत्तर देने का प्रयास करें, लेकिन यदि आप "मौजूदा कनेक्शन बंद करें" चेकबॉक्स को चेक करते हैं तो ** ** ** स्क्रिप्ट पर वैकल्पिक डेटाबेस लाइन नहीं जोड़ता है। –

+0

विज़ार्ड से उत्पन्न स्क्रिप्ट में मेरे लिए 'डेटाबेस बदलें' पंक्ति शामिल थी। – nick

+0

अजीब। कौन सा प्रबंधन स्टूडियो संस्करण? मैं 2008 x64 पर हूँ। –

12

ALTER DATABASE SET प्रलेखन के अनुसार, वहाँ अभी भी एक संभावना है कि SINGLE_USER मोड के लिए एक डेटाबेस सेट करने के बाद आपको लगता है कि डेटाबेस का उपयोग करने में सक्षम नहीं होगा:

SINGLE_USER में डेटाबेस सेट करने से पहले, सत्यापित करें कि AUTO_UPDATE_STATISTICS_ASYNC विकल्प बंद है। चालू होने पर, आंकड़े अपडेट करने के लिए उपयोग किए गए पृष्ठभूमि थ्रेड डेटाबेस के विरुद्ध कनेक्शन लेते हैं, और आप एकल-उपयोगकर्ता मोड में डेटाबेस तक पहुंचने में असमर्थ होंगे।

तो, एक पूरी स्क्रिप्ट मौजूदा कनेक्शन के साथ डेटाबेस ड्रॉप करने के लिए इस तरह लग रहे हो सकता है:

DECLARE @dbId int 
DECLARE @isStatAsyncOn bit 
DECLARE @jobId int 
DECLARE @sqlString nvarchar(500) 

SELECT @dbId = database_id, 
     @isStatAsyncOn = is_auto_update_stats_async_on 
FROM sys.databases 
WHERE name = 'db_name' 

IF @isStatAsyncOn = 1 
BEGIN 
    ALTER DATABASE [db_name] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 

    -- kill running jobs 
    DECLARE jobsCursor CURSOR FOR 
    SELECT job_id 
    FROM sys.dm_exec_background_job_queue 
    WHERE database_id = @dbId 

    OPEN jobsCursor 

    FETCH NEXT FROM jobsCursor INTO @jobId 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     set @sqlString = 'KILL STATS JOB ' + STR(@jobId) 
     EXECUTE sp_executesql @sqlString 
     FETCH NEXT FROM jobsCursor INTO @jobId 
    END 

    CLOSE jobsCursor 
    DEALLOCATE jobsCursor 
END 

ALTER DATABASE [db_name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

DROP DATABASE [db_name] 
2

मैं tryed क्या hgmnz saids SQL सर्वर पर 2012

प्रबंधन मेरे लिए बनाया:

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'MyDataBase' 
GO 
USE [master] 
GO 
/****** Object: Database [MyDataBase] Script Date: 09/09/2014 15:58:46 ******/ 
DROP DATABASE [MyDataBase] 
GO 
+3

यह सक्रिय कनेक्शन को बंद नहीं करेगा। – Jens

+0

सुनिश्चित करें कि आपने "मौजूदा कनेक्शन बंद करें" की जांच की है; यदि आप 'रोलबैक तत्काल' कथन शामिल नहीं करेंगे। 'Sp_delete_database_backuphistory'" बैकअप हटाएं और डेटाबेस के लिए इतिहास जानकारी पुनर्स्थापित करें "की जांच करने से आता है। –

+0

"मौजूदा कनेक्शन बंद करें" की जांच करना 'वैकल्पिक डाटाबेस सेट SINGLE_USER ...' उत्पन्न नहीं करता है, अगर बंद करने के लिए कोई मौजूदा कनेक्शन नहीं है। – ahwm

0

मुझे पता है कि यह बहुत देर हो चुकी है लेकिन यह किसी की मदद कर सकती है। इसका उपयोग करने पर अपना डेटाबेस ऑफ़लाइन

ALTER DATABASE dbname SET OFFLINE 
संबंधित मुद्दे