जवाबों:
कारण यह है कि आदम ने जिस दृष्टिकोण का सुझाव दिया है वह काम नहीं करेगा वह यह है कि उस समय के दौरान जब आप सक्रिय कनेक्शन पर लूप कर रहे हैं नया स्थापित किया जा सकता है, और आप उन लोगों को याद करेंगे। आप इसके बजाय निम्नलिखित दृष्टिकोण का उपयोग कर सकते हैं जिसमें यह कमी नहीं है:
-- set your current connection to use master otherwise you might get an error
use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE
--do you stuff here
ALTER DATABASE YourDatabase SET MULTI_USER
इसे पूरा करने के लिए स्क्रिप्ट, सभी कनेक्शनों को मारने के लिए डेटाबेस के साथ 'DB_NAME' को बदलें:
USE master
GO
SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''
Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END
and spid <> @@SPID
है SELECT @sKillConnection
ताकि यह मेरे वर्तमान कनेक्शन को मारने की कोशिश न करे, जो एक त्रुटि संदेश उत्पन्न करेगा।
इसे मार डालो, और इसे आग से मार डालो:
USE master
go
DECLARE @dbname sysname
SET @dbname = 'yourdbname'
DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END
SQL प्रबंधन स्टूडियो एक्सप्रेस का उपयोग करना:
ऑब्जेक्ट एक्सप्लोरर ट्री में प्रबंधन के तहत "एक्टिविटी मॉनिटर" के नीचे ड्रिल करें (यदि आप इसे वहां नहीं पा सकते हैं तो डेटाबेस सर्वर पर राइट क्लिक करें और "एक्टिविटी मॉनिटर" का चयन करें)। गतिविधि मॉनिटर खोलना, आप सभी प्रक्रिया की जानकारी देख सकते हैं। आपको उस डेटाबेस के लिए ताले ढूंढने में सक्षम होना चाहिए जिसे आप रुचि रखते हैं और उन तालों को मार सकते हैं, जो कनेक्शन को भी मार देंगे।
आपको उसके बाद नाम बदलने में सक्षम होना चाहिए।
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE [Test]
SET ONLINE
ऑफ़लाइन होने में कुछ समय लगता है और कभी-कभी मुझे इसके साथ कुछ समस्याओं का अनुभव होता है।
मेरी राय में सबसे ठोस तरीका:
डिटैच राइट डीबी क्लिक करें -> कार्य -> डिटैच ... चेक "ड्रॉप कनेक्शंस" ठीक है
Reattach राइट क्लिक डेटाबेस -> संलग्न करें ... जोड़ें ... -> अपने डेटाबेस का चयन करें, और अटैच के रूप में कॉलम को अपने डेटाबेस डेटाबेस नाम में बदलें। ठीक
Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'
Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((
select ' ' + KillCommand from #temp
FOR XML PATH('')),1,1,'')
Execute sp_executesql @query
Drop table #temp
'मास्टर' डेटाबेस का उपयोग करें और इस क्वेरी को चलाएं, यह आपके डेटाबेस से सभी सक्रिय कनेक्शनों को मार देगा।
मैं आमतौर पर उस त्रुटि में भाग लेता हूं जब मैं एक डेटाबेस को पुनर्स्थापित करने की कोशिश कर रहा हूं, जो मैं आमतौर पर प्रबंधन स्टूडियो में पेड़ के शीर्ष पर जाता हूं और डेटाबेस सर्वर पर राइट क्लिक करता हूं और फिर से शुरू करता हूं (क्योंकि यह एक विकास मशीन पर है, यह उत्पादन में आदर्श नहीं हो सकता है )। यह सभी डेटाबेस कनेक्शन के करीब है।
ALTER DATABASE ... SET SINGLE_USER
अन्य उत्तरों में आदेशों ने वही लौटाया 'जो अनन्य लॉक नहीं प्राप्त कर सका' त्रुटि)।
ऑब्जेक्ट एक्सप्लोरर पर MS SQL सर्वर प्रबंधन स्टूडियो में, डेटाबेस पर राइट क्लिक करें। उस संदर्भ मेनू में, जो 'कार्य -> ऑफ़लाइन चुनें' का चयन करता है।
एक और "आग से इसे मार डालो" दृष्टिकोण केवल MSSQLSERVER सेवा को पुनरारंभ करना है। मुझे कमांडलाइन से सामान करना पसंद है। इसे बिल्कुल सीएमडी में चिपकाने से यह हो जाएगा: NET STOP MSSQLSERVER और NET START MSSQLSERVER
या "services.msc" खोलें और "SQL सर्वर (MSSQLSERVER)" ढूंढें और राइट-क्लिक करें, "पुनरारंभ करें" चुनें।
यह "निश्चित रूप से, निश्चित रूप से" उस उदाहरण पर चलने वाले सभी डेटाबेस के लिए सभी कनेक्शनों को मार देगा।
(मुझे सर्वर / डेटाबेस पर कॉन्फ़िगरेशन को बदलने और बदलने वाले कई दृष्टिकोणों से बेहतर यह पसंद है)
यहाँ पर MS SQL Server Management Studio 2008 में इस तरह की मज़बूती से काम करने का तरीका बताया गया है (यह अन्य संस्करणों के लिए भी काम कर सकता है):
इस परिदृश्य में मेरे लिए काम करने का विकल्प इस प्रकार है:
इसे इस्तेमाल करे:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
डेटाबेस के नाम पर राइट क्लिक करें, प्रॉपर्टी विंडो पाने के लिए प्रॉपर्टी पर क्लिक करें, ऑप्शन टैब खोलें और मल्टी यूजर से सिंगल यूजर के लिए "रिस्ट्रिक्ट एक्सेस" प्रॉपर्टी को बदलें। जब आप ओके बटन पर हिट करते हैं, तो यह आपको सभी खुले कनेक्शन को बंद करने का संकेत देगा, "हां" चुनें और आप डेटाबेस का नाम बदलने के लिए तैयार हैं ...।
मैं SQL Server 2008 R2 का उपयोग कर रहा हूं, मेरा DB पहले से ही एकल उपयोगकर्ता के लिए सेट था और एक कनेक्शन था जो डेटाबेस पर किसी भी कार्रवाई को प्रतिबंधित करता था। इस प्रकार अनुशंसित SQLMenace के समाधान ने त्रुटि के साथ प्रतिक्रिया दी। यहाँ एक है कि मेरे मामले में काम किया है ।
मैं डेटाबेस में सभी प्रक्रिया की सूची प्राप्त करने के लिए sp_who का उपयोग करता हूं। यह बेहतर है क्योंकि आप समीक्षा करना चाहते हैं कि किस प्रक्रिया को मारना है।
declare @proc table(
SPID bigint,
Status nvarchar(255),
Login nvarchar(255),
HostName nvarchar(255),
BlkBy nvarchar(255),
DBName nvarchar(255),
Command nvarchar(MAX),
CPUTime bigint,
DiskIO bigint,
LastBatch nvarchar(255),
ProgramName nvarchar(255),
SPID2 bigint,
REQUESTID bigint
)
insert into @proc
exec sp_who2
select *, KillCommand = concat('kill ', SPID, ';')
from @proc
परिणाम
आप जिस प्रक्रिया को करना चाहते हैं उसे मारने के लिए आप किलकोमैंड कॉलम में कमांड का उपयोग कर सकते हैं।
SPID KillCommand
26 kill 26;
27 kill 27;
28 kill 28;
आप SP_Who कमांड का उपयोग कर सकते हैं और अपने डेटाबेस का उपयोग करने वाली सभी प्रक्रिया को मार सकते हैं और फिर अपने डेटाबेस का नाम बदल सकते हैं।