এসকিউএল সার্ভার ডাটাবেসে সমস্ত সারণী থেকে সমস্ত সারি কীভাবে মুছবেন?
এসকিউএল সার্ভার ডাটাবেসে সমস্ত সারণী থেকে সমস্ত সারি কীভাবে মুছবেন?
উত্তর:
মনে রাখবেন যে আপনার কোনও রেফারেন্সিয়াল অখণ্ডতা সেট থাকলে ট্রানসেট কাজ করবে না।
সেক্ষেত্রে এটি কাজ করবে:
EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON ?'
GO
USE [MyDataBase]
? উপরের ধারণাটি কি কোনওভাবে অভিযোজিত হলে কাজ করবে? ... কারণ আমি এসকিউএল সার্ভারের দ্বারা রাখা সমস্ত ডিবি মুছে ফেলতে চাই না।
আমার সাম্প্রতিক প্রকল্পে আমার কাজটি ছিল এসকিএল স্টেটমেন্ট এবং প্রতিটি টেবিলের প্রাথমিক কী এবং বিদেশী কী এর মতো অনেকগুলি প্রতিবন্ধকতা ব্যবহার করে একটি সম্পূর্ণ ডাটাবেস পরিষ্কার করা। ডাটাবেসে 1000 টিরও বেশি টেবিল রয়েছে সুতরাং প্রতিটি এবং সর্বদা সারণীতে একটি মুছা কোয়েরি লেখা সম্ভব নয়।
Sp_MSforEachTable নামে একটি সঞ্চিত পদ্ধতি ব্যবহার করে যা আমাদের একক ডাটাবেসে প্রতিটি টেবিলে সহজেই কিছু কোড প্রক্রিয়া করতে দেয়। এর অর্থ এটি ডাটাবেসের প্রতিটি টেবিলের বিপরীতে একটি একক টি-এসকিউএল কমান্ড বা আলাদা টি-এসকিউএল কমান্ড প্রক্রিয়া করতে ব্যবহৃত হয়।
সুতরাং এসকিউএল সার্ভার ডাটাবেসে সমস্ত সারণী ছাঁটাই করতে নীচের পদক্ষেপগুলি অনুসরণ করুন:
পদক্ষেপ 1- নীচে বর্গ কোয়েরি ব্যবহার করে ডাটাবেসের সমস্ত সীমাবদ্ধতা অক্ষম করুন:
EXEC sys.sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
পদক্ষেপ 2- নীচে sql কমান্ডটি ব্যবহার করে ডাটাবেসের প্রতিটি টেবিলের মুছুন বা কাটা অপারেশন সম্পাদন করুন:
EXEC sys.sp_msforeachtable 'DELETE FROM ?'
পদক্ষেপ 3- এসকিএল স্টেটমেন্টটি নীচে ব্যবহার করে ডাটাবেসে সমস্ত সীমাবদ্ধতা সক্ষম করুন:
EXEC sys.sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
sql server azure
?
আমাকে সমস্ত সারি মুছতে হয়েছিল এবং পরবর্তী স্ক্রিপ্ট দিয়ে এটি করতে হয়েছিল:
DECLARE @Nombre NVARCHAR(MAX);
DECLARE curso CURSOR FAST_FORWARD
FOR
Select Object_name(object_id) AS Nombre from sys.objects where type = 'U'
OPEN curso
FETCH NEXT FROM curso INTO @Nombre
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
DECLARE @statement NVARCHAR(200);
SET @statement = 'DELETE FROM ' + @Nombre;
print @statement
execute sp_executesql @statement;
END
FETCH NEXT FROM curso INTO @Nombre
END
CLOSE curso
DEALLOCATE curso
আশাকরি এটা সাহায্য করবে!
এখানে একটি সমাধান যা:
INFORMATION_SCHEMA.TABLES
একটি নির্দিষ্ট ডাটাবেসের জন্য মাধ্যমে আইট্রেটসSELECTS
কিছু অনুসন্ধানের মানদণ্ডের ভিত্তিতে সারণীসমূহsysdiagrams
এবং এর জন্য উপেক্ষা করার অনুমতি দেয়__RefactorLog
আমি প্রথমে চেষ্টা করেছি EXECUTE sp_MSforeachtable 'TRUNCATE TABLE ?'
, কিন্তু এটি আমার চিত্রগুলি মুছে ফেলেছে।
USE <DB name>;
GO
-- Disable all constraints in the database
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
declare @catalog nvarchar(250);
declare @schema nvarchar(250);
declare @tbl nvarchar(250);
DECLARE i CURSOR LOCAL FAST_FORWARD FOR select
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME
from INFORMATION_SCHEMA.TABLES
where
TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME != 'sysdiagrams'
AND TABLE_NAME != '__RefactorLog'
OPEN i;
FETCH NEXT FROM i INTO @catalog, @schema, @tbl;
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql NVARCHAR(MAX) = N'DELETE FROM [' + @catalog + '].[' + @schema + '].[' + @tbl + '];'
/* Make sure these are the commands you want to execute before executing */
PRINT 'Executing statement: ' + @sql
-- EXECUTE sp_executesql @sql
FETCH NEXT FROM i INTO @catalog, @schema, @tbl;
END
CLOSE i;
DEALLOCATE i;
-- Re-enable all constraints again
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
ALTER TABLE
নিষ্ক্রিয় সীমাবদ্ধতার বিট ব্যর্থ।
আমার ক্ষেত্রে, আমাকে QUOTED_IDENTIFIER চালু করা দরকার। এটি উপরে মার্ক রেন্ডেলের উত্তরের উপরে সামান্য পরিবর্তন সাধিত করেছিল:
EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'SET QUOTED_IDENTIFIER ON; DELETE FROM ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON ?'
GO
DELETE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.
Set nocount on
Exec sp_MSForEachTable 'Alter Table ? NoCheck Constraint All'
Exec sp_MSForEachTable
'
If ObjectProperty(Object_ID(''?''), ''TableHasForeignRef'')=1
Begin
-- Just to know what all table used delete syntax.
Print ''Delete from '' + ''?''
Delete From ?
End
Else
Begin
-- Just to know what all table used Truncate syntax.
Print ''Truncate Table '' + ''?''
Truncate Table ?
End
'
Exec sp_MSForEachTable 'Alter Table ? Check Constraint All'
আপনি রুবেনের প্রস্তাবিত মতামত ব্যবহার করে সমস্ত টেবিল থেকে সমস্ত সারি মুছে ফেলতে পারেন বা আপনি সমস্ত টেবিলগুলি ড্রপ এবং পুনরায় তৈরি করতে পারবেন। যে কোনও উপায়ে সম্পূর্ণ ডিবি তৈরির স্ক্রিপ্টগুলি রাখা সর্বদা একটি ভাল ধারণা যাতে সহজ / দ্রুততম পদ্ধতি হতে পারে।
কিছু প্রয়োজনীয়তার জন্য আমাদের নির্দিষ্ট টেবিলগুলি এড়িয়ে যেতে হতে পারে। আমি টেবিলের তালিকা ফিল্টার করতে কিছু অতিরিক্ত শর্ত যুক্ত করতে নীচের স্ক্রিপ্টটি লিখেছি। নীচের স্ক্রিপ্টটি পূর্ব মোছার গণনা এবং পোস্ট মোছার গণনাও প্রদর্শন করবে।
IF OBJECT_ID('TEMPDB..#TEMPRECORDCOUNT') IS NOT NULL
DROP TABLE #TEMPRECORDCOUNT
CREATE TABLE #TEMPRECORDCOUNT
( TABLENAME NVARCHAR(128)
,PREDELETECOUNT BIGINT
,POSTDELETECOUNT BIGINT
)
INSERT INTO #TEMPRECORDCOUNT (TABLENAME, PREDELETECOUNT, POSTDELETECOUNT)
SELECT O.name TableName
,DDPS.ROW_COUNT PREDELETECOUNT
,NULL FROM sys.objects O
INNER JOIN (
SELECT OBJECT_ID, SUM(row_count) ROW_COUNT
FROM SYS.DM_DB_PARTITION_STATS
GROUP BY OBJECT_ID
) DDPS ON DDPS.OBJECT_ID = O.OBJECT_ID
WHERE O.type = 'U' AND O.name NOT LIKE 'OC%' AND O.schema_id = 1
DECLARE @TableName NVARCHAR(MAX);
DECLARE TableDeleteCursor CURSOR FAST_FORWARD
FOR
SELECT TableName from #TEMPRECORDCOUNT
OPEN TableDeleteCursor
FETCH NEXT FROM TableDeleteCursor INTO @TableName
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
DECLARE @STATEMENT NVARCHAR(MAX);
SET @STATEMENT = ' DISABLE TRIGGER ALL ON ' + @TableName +
'; ALTER TABLE ' + @TableName + ' NOCHECK CONSTRAINT ALL' +
'; DELETE FROM ' + @TableName +
'; ALTER TABLE ' + @TableName + ' CHECK CONSTRAINT ALL' +
'; ENABLE TRIGGER ALL ON ' + @TableName;
PRINT @STATEMENT
EXECUTE SP_EXECUTESQL @STATEMENT;
END
FETCH NEXT FROM TableDeleteCursor INTO @TableName
END
CLOSE TableDeleteCursor
DEALLOCATE TableDeleteCursor
UPDATE T
SET T.POSTDELETECOUNT = I.ROW_COUNT
FROM #TEMPRECORDCOUNT T
INNER JOIN (
SELECT O.name TableName, DDPS.ROW_COUNT ROW_COUNT
FROM sys.objects O
INNER JOIN (
SELECT OBJECT_ID, SUM(row_count) ROW_COUNT
FROM SYS.DM_DB_PARTITION_STATS
GROUP BY OBJECT_ID
) DDPS ON DDPS.OBJECT_ID = O.OBJECT_ID
WHERE O.type = 'U' AND O.name NOT LIKE 'OC%' AND O.schema_id = 1
) I ON I.TableName COLLATE DATABASE_DEFAULT = T.TABLENAME
SELECT * FROM #TEMPRECORDCOUNT
ORDER BY TABLENAME ASC
এই উত্তরটি পরিচয় কলামটি পুনরায় সেট করে জাখ স্মিথের জবাবকে জোর দেয় :
কোয়েরিটি এখানে:
-- Disable all constraints in the database
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
declare @catalog nvarchar(250);
declare @schema nvarchar(250);
declare @tbl nvarchar(250);
DECLARE i CURSOR LOCAL FAST_FORWARD FOR select
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME
from INFORMATION_SCHEMA.TABLES
where
TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME != 'sysdiagrams'
AND TABLE_NAME != '__RefactorLog'
-- Optional
-- AND (TABLE_SCHEMA = 'dbo')
OPEN i;
FETCH NEXT FROM i INTO @catalog, @schema, @tbl;
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql NVARCHAR(MAX) = N'DELETE FROM [' + @catalog + '].[' + @schema + '].[' + @tbl + '];'
/* Make sure these are the commands you want to execute before executing */
PRINT 'Executing statement: ' + @sql
--EXECUTE sp_executesql @sql
-- Reset identity counter if one exists
IF ((SELECT OBJECTPROPERTY( OBJECT_ID(@catalog + '.' + @schema + '.' + @tbl), 'TableHasIdentity')) = 1)
BEGIN
SET @sql = N'DBCC CHECKIDENT ([' + @catalog + '.' + @schema + '.' + @tbl + '], RESEED, 0)'
PRINT 'Executing statement: ' + @sql
--EXECUTE sp_executesql @sql
END
FETCH NEXT FROM i INTO @catalog, @schema, @tbl;
END
CLOSE i;
DEALLOCATE i;
-- Re-enable all constraints again
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
--Load tables to delete from
SELECT
DISTINCT
' Delete top 1000000 from <DBName>.<schema>.' + c.TABLE_NAME + ' WHERE <Filter Clause Here>' AS query,c.TABLE_NAME AS TableName, IsDeleted=0, '<InsertSomeDescriptorHere>' AS [Source]--,t.TABLE_TYPE, c.*
INTO dbo.AllTablesToDeleteFrom
FROM INFORMATION_SCHEMA.TABLES AS t
INNER JOIN information_schema.columns c ON c.TABLE_NAME = t.TABLE_NAME
WHERE c.COLUMN_NAME = '<column name>'
AND c.TABLE_SCHEMA = 'dbo'
AND c.TABLE_CATALOG = '<DB Name here>'
AND t.TABLE_TYPE='Base table'
--AND t.TABLE_NAME LIKE '<put filter here>'
DECLARE @TableSelect NVARCHAR(1000)= '';
DECLARE @Table NVARCHAR(1000)= '';
DECLARE @IsDeleted INT= 0;
DECLARE @NumRows INT = 1000000;
DECLARE @Source NVARCHAR(50)='';
WHILE ( @IsDeleted = 0 )
BEGIN
--This grabs one table at a time to be deleted from. @TableSelect has the sql to execute. it is important to order by IsDeleted ASC
--because it will pull tables to delete from by those that have a 0=IsDeleted first. Once the loop grabs a table with IsDeleted=1 then this will pop out of loop
SELECT TOP 1
@TableSelect = query,
@IsDeleted = IsDeleted,
@Table = TableName,
@Source=[a].[Source]
FROM dbo.AllTablesToDeleteFrom a
WHERE a.[Source]='SomeDescriptorHere'--use only if needed
ORDER BY a.IsDeleted ASC;--this is required because only those records returned with IsDeleted=0 will run through loop
--SELECT @Table; can add this in to monitor what table is being deleted from
WHILE ( @NumRows = 1000000 )--only delete a million rows at a time?
BEGIN
EXEC sp_executesql @TableSelect;
SET @NumRows = @@ROWCOUNT;
--IF @NumRows = 1000000 --can do something here if needed
--One wants this loop to continue as long as a million rows is deleted. Once < 1 million rows is deleted it pops out of loop
--and grabs next table to delete
-- BEGIN
--SELECT @NumRows;--can add this in to see current number of deleted records for table
INSERT INTO dbo.DeleteFromAllTables
( tableName,
query,
cnt,
[Source]
)
SELECT @Table,
@TableSelect,
@NumRows,
@Source;
-- END;
END;
SET @NumRows = 1000000;
UPDATE a
SET a.IsDeleted = 1
FROM dbo.AllTablesToDeleteFrom a
WHERE a.TableName = @Table;
--flag this as deleted so you can move on to the next table to delete from
END;