আমি কীভাবে স্কাইল স্ক্রিপ্টে "বিদ্যমান সংযোগগুলি বন্ধ করুন" নির্দিষ্ট করব


153

আমি এসকিউএল সার্ভার ২০০৮ সালে আমার স্কিমাটিতে সক্রিয় বিকাশ করছি এবং ঘন ঘন আমার ড্রপটি পুনরায় চালু করতে / ডাটাবেস স্ক্রিপ্ট তৈরি করতে চাই। আমি যখন দৌড়ান

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.

যদি আপনি অবজেক্ট এক্সপ্লোরার ফলকের ডাটাবেসে ডান ক্লিক করেন এবং প্রসঙ্গ মেনু থেকে মুছুন টাস্কটি নির্বাচন করেন, সেখানে একটি চেকবক্স রয়েছে যা "বিদ্যমান সংযোগগুলি বন্ধ করে"

আমার স্ক্রিপ্টে এই বিকল্পটি নির্দিষ্ট করার কোনও উপায় আছে কি?

উত্তর:


247

আপনি সকলকে সংযোগ বিচ্ছিন্ন করতে এবং এর সাথে লেনদেনগুলি আবার রোল করতে পারেন:

alter database [MyDatbase] set single_user with rollback immediate

এর পরে, আপনি নিরাপদে ডাটাবেসটি ফেলে দিতে পারেন :)


8
আমি এটি ব্যবহার করেছি তবে প্রায়শই ভাবতাম যে যদি অন্য একজন ব্যবহারকারীকে "একক ব্যবহারকারী" হিসাবে প্রবেশ করার সুযোগের উইন্ডো ছিল - তবে এটি কি সম্ভব? সম্ভাব্য বিকল্প ALTER ডেটাবেস [MyDatabaseName] সেট অফলাইনের সাহায্যে রোলব্যাক অবিলম্বে হয়
ক্রিস্টেন

9
একক_ ব্যবহারকারী ব্যবহারকারী আপনি; আপনি যদি একক ব্যবহারকারী মোড সেট করার পরে সংযোগ বিচ্ছিন্ন না করেন। তারপরে একটি (1) অন্যান্য ব্যবহারকারী লগ ইন করতে পারেন।
Andomar

আপনি একবার ডাটাবেস বাদ দিলে, আপনি যদি একই নামটি দিয়ে একটি নতুন তৈরি করেন তবে আমি অনুমান করি যে এটি মাল্টি_উজার মোডে থাকবে? সুতরাং আপনাকে চালাতে হবে না: ডাটাবেস [মাইড্যাটবেস] পরিবর্তন করুন মাল্টি_উজার
অ্যান্ডি

@ অ্যান্ডিএম: হ্যাঁ, মাল্টি_উজার সম্ভবত ডিফল্ট
অ্যান্ডোমার

2
@ ক্রিসটেন আপনার পদ্ধতির ব্যবহার করে আমি দেখতে পেলাম যে এসকিএল সার্ভারটি এমডিএফ এবং এলডিএফ ফাইলগুলি সরিয়ে দেয় না। একা_ ব্যবহারকারী আমার জন্য সূক্ষ্ম কাজ করে (আমাকে নিয়মিত ডিবি পুনরায় তৈরি করা প্রয়োজন) সেট করুন।
এক্সম্যাক্স

36

ম্যানেজমেন্ট স্টুডিওতে যান এবং আপনি বর্ণিত সমস্ত কিছু করুন, কেবল ওকে ক্লিক করার পরিবর্তে স্ক্রিপ্টে ক্লিক করুন। এটি কোডটি চালাবে যা এটি আপনার স্ক্রিপ্টগুলিতে অন্তর্ভুক্ত করতে পারে show

এই ক্ষেত্রে, আপনি চান:

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

1
আপনি যা বর্ণনা করেছেন ঠিক সেভাবেই এই প্রশ্নের উত্তর দেওয়ার চেষ্টা করতে যাচ্ছিলাম ("মুছে ফেলা ডাটাবেস" ডায়ালগ স্ক্রিপ্ট করে) তবে আপনি যদি "বিদ্যমান সংযোগগুলি বন্ধ করুন" চেকবক্সটি পরীক্ষা করেন তবে স্ক্রিপ্টে এটি ALTER DATABASE লাইনটি যুক্ত করে না
ম্যাট হ্যামিল্টন

উইজার্ড থেকে তৈরি স্ক্রিপ্টটিতে আমার জন্য 'অল্টার ডাটাবেস' লাইন অন্তর্ভুক্ত ছিল।
নিক

রহস্যময়। কোন পরিচালনা স্টুডিও সংস্করণ? আমি ২০০৮ x64 এ আছি।
ম্যাট হ্যামিল্টন

আমিও: মাইক্রোসফ্ট এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও 10.0.1600.22 অপারেটিং সিস্টেম 6.0.6001
নিক

8
অ্যালটার ডাটাবেসে স্ক্রিপ্টে যোগ না করা নিয়ে একই সমস্যা ছিল। স্ক্রিপ্টে এটি যুক্ত করার জন্য আমাকে স্ক্রিপ্টটি তৈরি করার সময় আমাকে নিশ্চিত করতে হয়েছিল যে সেই ডাটাবেসের বিরুদ্ধে আমার একটি প্রক্রিয়া চলছে (সক্রিয় সংযোগ)।
গিলবার্ট

16

মতে ALTER ডেটাবেস সেট ডকুমেন্টেশন, এখনও আছে যে একটি সম্ভাবনা SINGLE_USER মোডে একটি ডাটাবেস নির্ধারণের পরে আপনি অ্যাক্সেস যে ডাটাবেসের সাথে পারবে না হল:

আপনি SINGLE_USER এ ডাটাবেস সেট করার আগে, AUTO_UPDATE_STATISICS_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]

3

আমি জানি এটি অনেক দেরি হয়ে গেছে তবে এটি হতে পারে এটির কারও কারও সহায়ক। এটি ব্যবহার করে আপনার ডাটাবেস অফলাইনে নিন

ALTER DATABASE dbname SET OFFLINE

মন্তব্য: "অফলাইন ডাটাবেস ড্রপ" পরে, ফাইল মোডফ বাদ না! stackoverflow.com/questions/33154141/...
bob217

2

Hgmnz এসকিউএল সার্ভারে যা বলেছে তা চেষ্টা করেছিলাম 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

4
এটি সক্রিয় সংযোগগুলি বন্ধ করবে না।
জেনস

নিশ্চিত হয়ে নিন যে আপনি "বিদ্যমান সংযোগগুলি বন্ধ করুন" পরীক্ষা করেছেন; আপনি ডন যদি ROLLBACK IMMEDIATEবিবৃতি অন্তর্ভুক্ত করা হবে। sp_delete_database_backuphistory"মুছে ব্যাকআপ এবং ডাটাবেস ইতিহাস তথ্য পুনরুদ্ধার" পরীক্ষণ থেকে আসে।
খ্রিস্টান.কে

"বিদ্যমান সংযোগগুলি বন্ধ করুন" চেক করা যদি বন্ধ ALTER DATABASE SET SINGLE_USER ...করার জন্য কোনও বর্তমান সংযোগ না থাকে তবে উত্পন্ন হয় না ।
অহউইএম

-1

আপনার ডাটাবেস ড্রপ করতে এই সি # কোড ব্যবহার করে দেখুন

সার্বজনীন স্ট্যাটিক শূন্যতা ড্রপডেটাবেসস (স্ট্রিং ডেটাবেস) {

        string sql =  "ALTER DATABASE "  + dataBase + "SET SINGLE_USER WITH ROLLBACK IMMEDIATE" ;

        using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["DBRestore"].ConnectionString))
        {
            connection.Open();
            using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, connection))
            {
                command.CommandType = CommandType.Text;
                command.CommandTimeout = 7200;
                command.ExecuteNonQuery();
            }
            sql = "DROP DATABASE " + dataBase;
            using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, connection))
            {
                command.CommandType = CommandType.Text;
                command.CommandTimeout = 7200;
                command.ExecuteNonQuery();
            }
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.