আমি কীভাবে সমস্ত টেবিল থেকে সমস্ত প্রতিবন্ধকতা ফেলে রাখব?


30

আমি একটি এসকিউএল সার্ভার ডাটাবেসে সমস্ত টেবিল থেকে সমস্ত ডিফল্ট সীমাবদ্ধতা, চেক সীমাবদ্ধতা, অনন্য বাধা, প্রাথমিক কী এবং বিদেশী কীগুলি ফেলে দিতে চাই। আমি জানি যে সমস্ত প্রতিবন্ধকতা নামগুলি থেকে sys.objectsকীভাবে পাওয়া যায় , তবে আমি কীভাবে ALTER TABLEঅংশটি জনপ্রিয় করব ?


কৌতূহলের বাইরে, এ জাতীয় অনুরোধের প্রসঙ্গ কী? কীভাবে কার্যক্ষম নির্ভরতাগুলি সম্বোধন করা হয় তা অবাক করে দিচ্ছি (যেমন সূচীকরণ মতামত, এফকেগুলিতে ক্যাসকেড ইভেন্টস এবং ইউকিউগুলিতে আইজিএনওর_ডিউপি_কেই = চালু ছিল)।
সলোমন রুটজকি

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

উত্তর:


36

আপনি sys.tables.object_id = sys.objects.parent_object_idobject অবজেক্টের ধরণের জন্য যোগ দিয়ে সহজেই এই তথ্যটি অর্জন করতে পারেন ।

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'
  ALTER TABLE ' + QUOTENAME(s.name) + N'.'
  + QUOTENAME(t.name) + N' DROP CONSTRAINT '
  + QUOTENAME(c.name) + ';'
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s 
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
ORDER BY c.[type];

PRINT @sql;
--EXEC sys.sp_executesql @sql;

PRINTআইবোলিংয়ের জন্য কেবল সেখানে রয়েছে - আপনার যদি অনেকগুলি প্রতিবন্ধকতা থাকে তবে এটি পুরো স্ক্রিপ্টটি না দেখায় কারণ এটি 8K এর মধ্যে সীমাবদ্ধ। এই ক্ষেত্রে, চালানোর আগে স্ক্রিপ্টটি বৈধ করার জন্য অন্যান্য উপায়গুলির জন্য এই টিপটি দেখুন ।

একবার আপনি যদি আউটপুট নিয়ে খুশি হন তবে এটিকে কোনও অসুবিধে করবেন না EXEC


3
আপনি প্রাথমিক কীগুলির আগে বিদেশী কী বাধাগুলি ফেলে দেওয়ার বিষয়টি নিশ্চিত করতেও পারেন; ORDER BY (CASE WHEN c.[type] IN ('PK', 'UQ') THEN 1 ELSE 0 END)
ড্যানিয়েল হুটমাচার

1
@ ড্যানিয়েল ভাল পয়েন্ট, এসকিউএল সার্ভার নতুন সীমাবদ্ধতার ধরণের প্রবর্তন না করা পর্যন্ত অর্ডার দ্বারা টাইপ যথেষ্টই যথেষ্ট।
অ্যারন বার্ট্র্যান্ড

6

আমি গ্রহণযোগ্য উত্তর দিয়ে শুরু করেছি এবং গতিশীল স্কয়ারে সম্পূর্ণ এসকিএল স্টেটমেন্ট তৈরির পরিবর্তে কিছুক্ষণ লুপ ব্যবহার করার জন্য কাঠামোটি সংশোধন করেছি। আমি বেশ কয়েকটি কারণে এটি আরও ভাল পছন্দ করি।

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

Set NoCount ON

Declare @schemaName varchar(200)
set @schemaName=''
Declare @constraintName varchar(200)
set @constraintName=''
Declare @tableName varchar(200)
set @tableName=''

While exists
(   
    SELECT c.name
    FROM sys.objects AS c
    INNER JOIN sys.tables AS t
    ON c.parent_object_id = t.[object_id]
    INNER JOIN sys.schemas AS s 
    ON t.[schema_id] = s.[schema_id]
    WHERE c.[type] IN ('D','C','F','PK','UQ')
    and t.[name] NOT IN ('__RefactorLog', 'sysdiagrams')
    and c.name > @constraintName
)

Begin   
    -- First get the Constraint
    SELECT 
        @constraintName=min(c.name)
    FROM sys.objects AS c
    INNER JOIN sys.tables AS t
    ON c.parent_object_id = t.[object_id]
    INNER JOIN sys.schemas AS s 
    ON t.[schema_id] = s.[schema_id]
    WHERE c.[type] IN ('D','C','F','PK','UQ')
    and t.[name] NOT IN ('__RefactorLog', 'sysdiagrams')
    and c.name > @constraintName

    -- Then select the Table and Schema associated to the current constraint
    SELECT 
        @tableName = t.name,
        @schemaName = s.name
    FROM sys.objects AS c
    INNER JOIN sys.tables AS t
    ON c.parent_object_id = t.[object_id]
    INNER JOIN sys.schemas AS s 
    ON t.[schema_id] = s.[schema_id]
    WHERE c.name = @constraintName

    -- Then Print to the output and drop the constraint
    Print 'Dropping constraint ' + @constraintName + '...'
    Exec('ALTER TABLE [' + @schemaName + N'].[' + @tableName + N'] DROP CONSTRAINT [' + @constraintName + ']')
End

Set NoCount OFF
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.