sql server - কিভাবে একটি SQL সার্ভার ডাটাবেস সব টেবিল ড্রপ?




sql-server sql-server-2008 (10)

আমি একটি স্ক্রিপ্ট লিখতে চেষ্টা করছি যা সম্পূর্ণরূপে একটি SQL সার্ভার ডাটাবেস খালি করবে। এই পর্যন্ত আমি কি আছে:

USE [dbname]
GO
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DELETE ?'

যখন আমি ম্যানেজমেন্ট স্টুডিওতে এটি চালাচ্ছি, তখন আমি এটি পেতে পারি:

কমান্ড (গুলি) সফলভাবে সম্পন্ন।

কিন্তু যখন আমি টেবিল তালিকাটি রিফ্রেশ করি, তারা তখনও সেখানে থাকে। আমি কি ভুল করছি?


আপনি কেবলমাত্র MSSMS সরঞ্জামগুলি ব্যবহার করে ডাটাবেসের সমস্ত সারণি মুছে ফেলতে পারেন (SQL ব্যবহার না করে)। কখনও কখনও এই ভাবে আরো আরামদায়ক হতে পারে (বিশেষ করে এটি মাঝে মাঝে সঞ্চালিত হয়)

নিম্নরূপ আমি ধাপে এই ধাপে না:

  1. ডাটাবেস ট্রি (বস্তু এক্সপ্লোরার) -এ 'টেবিল' নির্বাচন করুন
  2. অবজেক্ট এক্সপ্লোরার বিস্তারিত দেখুন খুলতে F7 টিপুন
  3. এই দর্শনে নির্বাচিত সারণীগুলি মুছে ফেলতে হবে (এই ক্ষেত্রে সবগুলিই)
  4. সমস্ত টেবিল মুছে ফেলা না হওয়া পর্যন্ত মুছুন টিপুন (আপনি মূল সীমাবদ্ধতা / নির্ভরতার কারণে ত্রুটিগুলির পরিমাণ হিসাবে এটি পুনরাবৃত্তি করুন)

আপনি প্রায় সঠিক, পরিবর্তে ব্যবহার করুন:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DROP TABLE ?'

তবে দ্বিতীয় লাইনটি আপনাকে একবার একবার চালানোর প্রয়োজন হতে পারে যতক্ষণ না আপনি ত্রুটিটি বন্ধ না করেন:

Could not drop object 'dbo.table' because it is referenced by a FOREIGN KEY constraint.

বার্তা:

Command(s) completed successfully.

মানে যে সব টেবিল সফলভাবে মুছে ফেলা হয়েছে।


আমি জানি এটি এখন একটি পুরাতন পোস্ট কিন্তু আমি এখানে অনেকগুলি উপাত্তের উপর সমস্ত উত্তর চেষ্টা করেছি এবং আমি দেখেছি তারা সব সময় বিভিন্ন কাজ করে তবে বিভিন্ন সময় (আমি কেবলমাত্র অনুমান করতে পারি) SQL সার্ভারের quirks।

অবশেষে আমি এই সঙ্গে এসেছিলেন। আমি সর্বত্র এটি পরীক্ষা করেছি (সাধারণত বলছি) আমি করতে পারি এবং এটি কাজ করে (কোন লুকানো স্টোর পদ্ধতি ছাড়াই)।

বেশিরভাগই এসকিউএল সার্ভার ২014-এ নোটের জন্য। (তবে আমি যে অন্যান্য সংস্করণগুলি চেষ্টা করেছি তাও সূক্ষ্ম কাজ বলে মনে হচ্ছে)।

আমি loops এবং nulls ইত্যাদি চেষ্টা করেছি ইত্যাদি, কার্সার এবং বিভিন্ন অন্যান্য ফর্ম কিন্তু তারা সবসময় কিছু ডাটাবেস ব্যর্থ কিন্তু অন্য কোন কারণ জন্য ব্যর্থ মনে হচ্ছে।

একটি গণনা এবং পুনরাবৃত্তি যে ব্যবহার করে সবসময় আমি পরীক্ষা করেছি সবকিছু কাজ মনে হয়।

USE [****YOUR_DATABASE****]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- Drop all referential integrity constraints --
-- Drop all Primary Key constraints.          --

DECLARE @sql  NVARCHAR(296)
DECLARE @table_name VARCHAR(128)

DECLARE @constraint_name VARCHAR(128)
SET @constraint_name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME

WHILE @row_number > 0
BEGIN
    BEGIN
        SELECT TOP 1 @table_name = tc2.TABLE_NAME, @constraint_name = rc1.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
        LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME
        AND rc1.CONSTRAINT_NAME > @constraint_name
        ORDER BY rc1.CONSTRAINT_NAME
        SELECT @sql = 'ALTER TABLE [dbo].[' + RTRIM(@table_name) +'] DROP CONSTRAINT [' + RTRIM(@constraint_name)+']'
        EXEC (@sql)
        PRINT 'Dropped Constraint: ' + @constraint_name + ' on ' + @table_name
        SET @row_number = @row_number - 1
    END
END
GO

-- Drop all tables --

DECLARE @sql  NVARCHAR(156)
DECLARE @name VARCHAR(128)
SET @name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM sysobjects WHERE [type] = 'U' AND category = 0

WHILE @row_number > 0
BEGIN
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
    SELECT @sql = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@sql)
    PRINT 'Dropped Table: ' + @name
    SET @row_number = @row_number - 1
END
GO

উপবাস উপায় হল:

  1. নতুন ডাটাবেস ডায়াগ্রাম
  2. সব টেবিল যোগ করুন
  3. Ctrl + A সব নির্বাচন করুন
  4. ডান ক্লিক করুন "ডাটাবেস থেকে সরান"
  5. Ctrl + S সংরক্ষণ করার জন্য
  6. উপভোগ করুন

এসএসএমএসে:

  • ডান ডাটাবেস ক্লিক করুন
  • "টাস্ক" এ যান
  • "স্ক্রিপ্ট জেনারেট করুন" ক্লিক করুন
  • "বস্তু নির্বাচন করুন" বিভাগে, "স্ক্রিপ্ট সম্পূর্ণ ডাটাবেস এবং সমস্ত ডাটাবেস বস্তু" নির্বাচন করুন
  • "স্ক্রিপ্টিং বিকল্পগুলি সেট করুন" বিভাগে, "উন্নত" বাটনে ক্লিক করুন
  • "স্ক্রিপ্ট ড্রপ এবং তৈরি করুন" স্ক্রিপ্ট তৈরি করুন "স্ক্রিপ্ট DROP" এ স্যুইচ করুন এবং ঠিক আছে টিপুন
  • তারপরে, ফাইল, ক্লিপবোর্ড বা নতুন কোয়েরি উইন্ডোতে সংরক্ষণ করুন।
  • স্ক্রিপ্ট চালান।

এখন, এই ডাটাবেস সহ সবকিছু ড্রপ করবে। আপনি চান না আইটেম জন্য কোড অপসারণ নিশ্চিত করুন। বিকল্পভাবে, "বস্তু নির্বাচন করুন" বিভাগে, স্ক্রিপ্টের সম্পূর্ণ ডাটাবেস নির্বাচনের পরিবর্তে কেবল যে আইটেমটি আপনি সরাতে চান তা নির্বাচন করুন।


কিভাবে সম্পূর্ণ ডাটাবেস ড্রপ এবং তারপর আবার তৈরি? এটা আমার জন্য কাজ করে।

DROP DATABASE mydb;
CREATE DATABASE mydb;

মনে হচ্ছে কমান্ড বর্গক্ষেত্র কম্বল ছাড়া করা উচিত

EXEC sp_msforeachtable 'drop table ?'

যদি আপনি সমস্ত সারণি ড্রপ করতে চান , তবে আপনি ডাটাবেসটি ড্রপ করতে পারেন এবং তারপরে একটি নতুন তৈরি করতে পারেন।

টি-এসকিউএল:

ড্রপ ডেটাবেস উত্তরবিন্দু
গো
ডেটাবেস Northwind তৈরি করুন
গো

এসকিউএল ম্যানেজমেন্ট স্টুডিওতে এটি অর্জন করতে (এসএসএমএস, আমার ক্ষেত্রে v.9.9.1):

  1. আপনি মুছে ফেলতে চান ডাটাবেস উপর ডান ক্লিক করুন, যেমন "Northwind";
    প্রসঙ্গ মেনুতে "মুছুন" নির্বাচন করুন
  2. "ডাটাবেস" (ফোল্ডার আইকন) উপর ডান ক্লিক করুন;
    "নতুন ডাটাবেস ..." নির্বাচন করুন
  3. ডাটাবেসের নাম টাইপ করুন, যেমন "নর্থউইন্ড";
    ঠিক আছে ক্লিক করুন

এবং তুমি করে ফেলেছ! আপনার কাছে কোনও টেবিল ছাড়া তা একটি নতুন ডাটাবেস আছে। এই পদ্ধতির সুবিধাটি হল যে, আপনি কোনও সীমাবদ্ধতার যত্ন নিতে, টেবিলগুলি ড্রপ করা, নির্ভরশীল মতামত বা এসপি এর আর কাজ না করা এবং আপনার কোনও গতিশীল SQL স্ক্রিপ্টগুলির প্রয়োজন নেই। আপনি যদি পরে একটি ব্যাকআপ গ্রহণ, আপনি পরে যারা পুনরায় যোগ করতে পারেন, তাই

আপনি যে আগে আপনার ডাটাবেস ব্যাকআপ মনে রাখবেন ! আপনি যদি কিছু এসপি বা মতামত চান তবে ডাটাবেস পুনরায় তৈরি করার আগে সেগুলি স্ক্রিপ্ট হিসাবে সংরক্ষণ করুন, এগুলি সম্পাদনা করুন যাতে তারা নতুন টেবিলগুলির সাথে কাজ করে এবং পরে সেগুলি যোগ করে।


delete ফেলা একটি টেবিল থেকে সারি মুছে delete জন্য ব্যবহৃত হয়। আপনি পরিবর্তে drop table ব্যবহার করা উচিত।

EXEC sp_msforeachtable 'drop table [?]'

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO





sp-msforeachtable