এসকিউএল সার্ভার ডাটাবেসে সমস্ত ডেটা মুছুন


129

আমি কীভাবে আমার ডাটাবেসের সমস্ত টেবিল থেকে সমস্ত রেকর্ড মুছতে পারি? আমি কি এটি একটি এসকিউএল কমান্ড দিয়ে করতে পারি বা আমার প্রতি টেবিলের জন্য একটি এসকিউএল কমান্ডের প্রয়োজন?

উত্তর:


194

এসকিউএলমেনিসের সমাধানটি আমার জন্য ডেটা কীভাবে মুছে ফেলা হয় - DELETE FROMতার পরিবর্তে সামান্য ঝাপটায় কাজ করেছিল TRUNCATE

-- disable referential integrity
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
GO 

EXEC sp_MSForEachTable 'DELETE FROM ?' 
GO 

-- enable referential integrity again 
EXEC sp_MSForEachTable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL' 
GO

মি টু .. আমি মুছতে সক্ষম হয়েছি, তবে কেটে যেতে পারি না।
মার্সেল

17
EXEC sp_MSForEachTable 'DBCC CHECKIDENT(''?'', RESEED, 0)'সমস্ত পরিচয় কলামগুলি আবার 0 এ পুনরায় সেট করার জন্য থেকে মুছে ফেলার পরে কিছু করাও বুদ্ধিমান হতে পারে
জোনাথন mend

1
আপনি যদি 6 টি লাইন কোডের সন্ধান করেন যা 100s মুছে ফেলার বিবৃতিগুলিকে প্রতিস্থাপন করে, তখনই এটি সর্বদা একটি দুর্দান্ত শুরু! এই পদ্ধতিটি এসকিউএল 2014 এক্সপ্রেসে ইস্যু ছাড়াই কাজ করে।
টমি 14


10
আমি ত্রুটি পেয়ে যাচ্ছিলাম - DELETE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'...। আমার জন্য কাজ করেছেন:EXEC sp_MSForEachTable 'SET QUOTED_IDENTIFIER ON; DELETE FROM ?'
কাসি

36

সাধারণত আমি কেবল অপ্রকাশিত proc sp_MSforEachTable ব্যবহার করব

-- disable referential integrity
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
GO 

EXEC sp_MSForEachTable 'TRUNCATE TABLE ?' 
GO 

-- enable referential integrity again 
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 
GO

আরও দেখুন: ডাটাবেসে সমস্ত ডেটা মুছুন (যখন আপনার এফকে থাকে)


1
আমি মনে করি না এটি কাজ করে। দেখে মনে হচ্ছে ক্যালেন ডেলানির এই ধারণাটি শুরু করার জন্য অজান্তেই দায়বদ্ধ ছিলেন। এখানে তিনি পরিষ্কার করে দিয়েছেন "টেবিলটি কাটাতে আপনাকে রেফারেন্সিং সীমাবদ্ধতা ফেলে দিতে হবে।"
মার্টিন স্মিথ

মার্টিন আমি ঠিক 2 সেকেন্ড আগে অ্যাডভেঞ্চারওয়ার্কস ডিবিতে কোনও সমস্যা ছাড়াই এটি
চালিয়েছি

এটি অবশ্যই এখানে আমার জন্য কাজ করে না। create database testing; GO use testing; create table t1 (i int primary key) create table t2(i int primary key,p int references t1)
মার্টিন স্মিথ

2
উত্তর হিসাবে চিহ্নিত হওয়া সত্ত্বেও এটি কাজ করে না। বিদেশী কীগুলিতে নকশাক সীমাবদ্ধতা সেট করা আপনাকে সেই টেবিলগুলিতে কাটা কমান্ড চালানোর অনুমতি দেয় না। আপনি এখনও ত্রুটিগুলি পাবেন যা আপনাকে কাটা কাটা থেকে আটকাবে।
চতুর্থ

3
বিদেশী কী উপস্থিত থাকার কারণে এটি কাজ করে না। এখনও কেন তা উত্তর হিসাবে গৃহীত হয়েছিল তা আমি দেখতে পাচ্ছি না: /
মওনাইম

19
/* Drop all non-system stored procs */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

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

WHILE @name is not null
BEGIN
    SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Procedure: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

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

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

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

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

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Function: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all Foreign 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 = 'FOREIGN 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 = 'FOREIGN 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 FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN 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 = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* 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' ব্যবহার করে না। যদিও [ডিবিও] এর চেয়ে অন্য কোনও স্কিমাতে আপনার যদি বস্তু থাকে তবে টুইট করা দরকার।
প্যাক0

ব্যবহার করুন gist.github.com/metaskills/893599 নভোনীল মধ্যে sp_MSForEachTable তৈরি করতে
Harpal

16

আমি জানি যে এটি দেরি হয়ে গেছে, তবে আমি টেবিলগুলি থেকে ডেটা মুছে ফেলার ঝামেলা না করে বরং অ্যালেক্সকুজনসভের ডেটাবেস স্ক্রিপ্ট করার পরামর্শের সাথে একমত হই। যদি TRUNCATEসমাধানটি কাজ করে না, এবং আপনার প্রচুর পরিমাণে ডেটা হয়ে থাকে, জারি করা (লগ করা) DELETEবিবৃতি পেতে অনেক বেশি সময় লাগতে পারে এবং আপনাকে সনাক্তকারীদের সাথে ছেড়ে দেওয়া হবে যা পুনরায় গবেষণা করা হয়নি (অর্থাত্ INSERTএকটি টেবিলের সাথে একটি বিবৃতি) একটি IDENTITYকলাম আপনাকে 1 এর ID এর পরিবর্তে 50000 এর আইডি পাবে।

একটি সম্পূর্ণ ডাটাবেস স্ক্রিপ্ট করতে, এসএসএমএসে, ডাটাবেসটিতে ডান ক্লিক করুন, তারপরে TASKS-> নির্বাচন করুন Generate scripts:

এখানে চিত্র বর্ণনা লিখুন

Nextউইজার্ড খোলার স্ক্রিন এড়ানোর জন্য ক্লিক করুন, এবং তারপরে আপনি কোন বিষয়গুলি স্ক্রিপ্ট করতে চান তা নির্বাচন করুন:

এখানে চিত্র বর্ণনা লিখুন

ইন Set scripting optionsপর্দা, আপনি সেটিংস স্ক্রিপ্টিং জন্য, কিনা সব বস্তু, বা পৃথক বস্তু জন্য পৃথক স্ক্রিপ্ট 1 স্ক্রিপ্ট জেনারেট করতে মত বাছাই করতে পারেন, এবং ইউনিকোড বা ANSI ফাইলটি সংরক্ষণ করা হবে কিনা তা:

এখানে চিত্র বর্ণনা লিখুন

উইজার্ড একটি সংক্ষিপ্তসার প্রদর্শন করবে, যা আপনি পছন্দসই হিসাবে যাচাই করা সমস্ত কিছু যাচাই করতে ব্যবহার করতে পারেন এবং 'সমাপ্তি' এ ক্লিক করে বন্ধ করুন।


সতর্কতা অবলম্বন করুন, আপনি "অ্যাডভান্সড" বোতামে না গেলে ডিফল্টরূপে আপনি সূচির মতো জিনিসগুলি হারাবেন।
গ্লুটরোউ

6
  1. প্রথমে আপনাকে সমস্ত ট্রিগারগুলি অক্ষম করতে হবে:

    sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all';
  2. এই স্ক্রিপ্টটি চালান: (এই পোস্টটি থেকে গৃহীত হয়েছে আপনাকে ধন্যবাদ এসকিউএলমেনেস)

    SET NOCOUNT ON
    GO
    
    SELECT 'USE [' + db_name() +']';
    ;WITH a AS 
    (
         SELECT 0 AS lvl, 
                t.object_id AS tblID 
         FROM sys.TABLES t
         WHERE t.is_ms_shipped = 0
           AND t.object_id NOT IN (SELECT f.referenced_object_id 
                                   FROM sys.foreign_keys f)
    
         UNION ALL
    
         SELECT a.lvl + 1 AS lvl, 
                f.referenced_object_id AS tblId
         FROM a
         INNER JOIN sys.foreign_keys f ON a.tblId = f.parent_object_id 
                                       AND a.tblID <> f.referenced_object_id
    )
    SELECT 
        'Delete from ['+ object_schema_name(tblID) + '].[' + object_name(tblId) + ']' 
    FROM a
    GROUP BY tblId 
    ORDER BY MAX(lvl),1

এই স্ক্রিপ্টটি DELETEযথাযথভাবে বিবৃতি দেবে । রেফারেন্সিং সারণী থেকে শুরু করে তারপর রেফারেন্সগুলি

  1. DELETE FROMবিবৃতিগুলি অনুলিপি করুন এবং একবার চালনা করুন

  2. ট্রিগারগুলি সক্ষম করুন

    sp_msforeachtable 'ALTER TABLE ? ENABLE TRIGGER all'
  3. পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ:

    begin transaction
    commit;

এটি আমার পক্ষে কাজ করে না, পুনরাবৃত্তির ক্যোয়ারী একটি লুপে শেষ হয়। স্ব-শ্রদ্ধার কারণে সম্ভবত।
এডউইন স্টটেলার

5

ডাটাবেসের সমস্ত বস্তুর স্ক্রিপ্ট আউট করা এবং টেবিলগুলি কেটে ফেলতে বা খালি করতে একটি খালি তৈরি করা সাধারণত খুব দ্রুত হয়।


3

স্ক্রিপ্টের নীচে যা আমি একটি এসকিউএল সার্ভার ডাটাবেস থেকে সমস্ত ডেটা অপসারণ করতে ব্যবহার করি

------------------------------------------------------------
/* Use database */ 
-------------------------------------------------------------

use somedatabase;

GO

------------------------------------------------------------------
/* Script to delete an repopulate the base [init database] */
------------------------------------------------------------------

-------------------------------------------------------------
/* Procedure delete all constraints */ 
-------------------------------------------------------------

IF EXISTS (SELECT name  
           FROM  sysobjects 
           WHERE name = 'sp_DeleteAllConstraints' AND type = 'P')
    DROP PROCEDURE dbo.sp_DeleteAllConstraints
GO

CREATE PROCEDURE sp_DeleteAllConstraints
AS
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
    EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
GO

-----------------------------------------------------
/* Procedure delete all data from the database */ 
-----------------------------------------------------

IF EXISTS (SELECT name  
           FROM  sysobjects 
           WHERE name = 'sp_DeleteAllData' AND type = 'P')
    DROP PROCEDURE dbo.sp_DeleteAllData
GO

CREATE PROCEDURE sp_DeleteAllData
AS
    EXEC sp_MSForEachTable 'DELETE FROM ?'
GO

-----------------------------------------------
/* Procedure enable all constraints */ 
-----------------------------------------------

IF EXISTS (SELECT name  
           FROM  sysobjects 
           WHERE name = 'sp_EnableAllConstraints' AND type = 'P')
    DROP PROCEDURE dbo.sp_EnableAllConstraints
GO
-- ....
-- ....
-- ....

1
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'

EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'

EXEC sp_MSForEachTable 'DELETE FROM ?'

EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'

EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'

GO

0

বিকল্প উত্তর হিসাবে, আপনি যদি ভিজ্যুয়াল স্টুডিও এসএসডিটি বা সম্ভবত রেড গেট এসকিএল তুলনা করেন, আপনি কেবল একটি স্কিমা তুলনা চালাতে পারেন, এটি স্ক্রিপ্ট আউট করতে পারেন, পুরাতন ডাটাবেসটি ফেলে দিতে পারেন (সম্ভবত কোনও ব্যাকআপ তৈরির ক্ষেত্রে আপনার প্রয়োজনের কারণ হতে পারে যে ডেটা), এবং তারপরে তুলনা সরঞ্জাম দ্বারা নির্মিত স্ক্রিপ্ট সহ একটি নতুন ডাটাবেস তৈরি করুন। খুব ছোট ডাটাবেসে এটি আরও বেশি কাজ হতে পারে তবে খুব বড় ডাটাবেসে ডাটাবেসটিতে থাকা বিভিন্ন ট্রিগার এবং প্রতিবন্ধকতাগুলি মোকাবেলা করার জন্য কেবল ডাটাবেসটি ফেলে দেওয়া খুব দ্রুত হবে।


-1

হ্যাঁ, কোডের একক লাইন দিয়ে মোছা সম্ভব

SELECT 'TRUNCATE TABLE ' + d.NAME + ';' 
FROM   sys.tables d 
WHERE  type = 'U' 

এটি আমাকে প্রতিটি টেবিলের জন্য একটি বিচ্ছিন্ন স্টেটমেন্ট সহ একটি নতুন টেবিল দেয়। এটি আসলে কোনও কিছু মুছবে না এবং দুর্ভাগ্যক্রমে এটি প্রথমে সীমাবদ্ধতা ফেলে দেওয়ার সমস্যার যত্ন নেয়। খুব খারাপ, আমি sp_MSforEachTable (যা আমার কাছে অজুর এসকিউএল সার্ভারের অস্তিত্ব নেই) ব্যবহার না করে আমি এর মতো একটি উত্তর আশা করছিলাম!
প্যাক 0

হ্যাঁ. সত্য। এটি সমস্ত টেবিলের জন্য কাটা স্ক্রিপ্ট তৈরি করে। সারণী ডেটা মুছতে সেই স্ক্রিপ্টটি ব্যবহার করুন।
বুদ্ধিকা দে সিলভা

এই সমাধানটি কেবলমাত্র সেই ক্ষেত্রে কাজ করে যে কোনও সম্পর্ক নেই, কারণ এটির গ্যারান্টি দেওয়ার কোনও উপায় নেই যে টেবিলগুলি সঠিক ক্রমে ফেলে দেওয়া হয়েছে। এছাড়াও, যদি ডেটা মোছার বিষয়ে কোনও ট্রিগার থাকে তবে এটি অনিচ্ছাকৃত পরিণতি ঘটাতে পারে।
dmoore1181
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.