সাময়িকভাবে সীমাবদ্ধতাগুলি বন্ধ করুন (এমএস এসকিউএল)


208

আমি অস্থায়ীভাবে ডিবির সমস্ত সীমাবদ্ধতাগুলি বন্ধ করার উপায় খুঁজছি (যেমন টেবিলের সম্পর্ক)।

আমার একটি ডিবি'র টেবিলগুলি অন্য ডিবিতে অনুলিপি করতে হবে (INSERTs ব্যবহার করে)। আমি জানি আমি যথাযথ আদেশে (সম্পর্ক ছিন্ন না করার জন্য) আদেশগুলি কার্যকর করে এটি অর্জন করতে পারি।

তবে যদি আমি অস্থায়ীভাবে চেকিং সীমাবদ্ধতাগুলি বন্ধ করে দিতে পারি এবং অপারেশন শেষ হয়ে যাওয়ার পরে এটি আবার চালু করি তবে এটি আরও সহজ হবে।

এটা কি সম্ভব?


3
এটি সম্পূর্ণ অনুলিপি নয় আমি কেবলমাত্র নির্বাচিত টেবিলগুলি অনুলিপি করতে চাই
ম্যাকিয়েজ

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

13
ভবিষ্যতের প্রিয় ব্যক্তিগণ: আপনি ডাটাবেসে সমস্ত সীমাবদ্ধতাগুলি একবারে অক্ষম করতে এবং পুনরায় সক্ষম করতে পারেন; দেখতে stackoverflow.com/a/161410
brichins

1
সীমাবদ্ধতা সক্ষম করতে ভুলবেন না, হয়ে গেলে!
মাইক খ্রিস্টান

1
@ নিকোলাস বারবুলেসকো ফেয়ার যথেষ্ট; আমি ট্যাগ sql-serverএবং sql-server-2005ট্যাগ বন্ধ ছিল । আমি যে লিঙ্কটি দিয়েছি তা এসকিউএল সার্ভারের জন্য, তবে আপনি ওরাকলে একই জিনিসটি করতে পারেন - এখানে এবং এখানে দেখুনপোস্টগ্র্রেএসকিউএল এ আপনি এটি করতেও পারেন ।
brichins

উত্তর:


214

আপনি কেবল এসকিউএল 2005+ এ এফকে এবং চেক সীমাবদ্ধতাগুলি অক্ষম করতে পারেন । বিকল্প টেবিল দেখুন

ALTER TABLE foo NOCHECK CONSTRAINT ALL

অথবা

ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column

প্রাথমিক কী এবং অনন্য সীমাবদ্ধতা অক্ষম করা যায় না, তবে আমি আপনাকে সঠিকভাবে বুঝতে পারলে এটি ঠিক করা উচিত।


10
তবে এটি অস্থায়ী নয়।
নিকোলাস বারবুলেসকো

@ নিকোলাস বার্বুলেসকো: এটি নির্ভর করে। হ্যাঁ এটি, এতে আপনি তাদের ড্রপ /
ক্রিয়েট

এই উত্তরটি একটি সমাধানের প্রথমার্ধ মাত্র। আমি সাময়িকভাবে প্রতিবন্ধকতাগুলি বন্ধ করার জন্য একটি সহজ উপায় খুঁজছিলাম এবং আমি এই সিদ্ধান্তে পৌঁছেছি যে ওরাকল-এর অস্তিত্ব নেই।
নিকোলাস বারবুলেসকো

এটি সত্য নয় যে পিকে এবং অনন্য সীমাবদ্ধতা অক্ষম করা যায় না। কমপক্ষে এসকিউএল সার্ভারের আরও সাম্প্রতিক সংস্করণে এটি কাজ করে। উদাহরণস্বরূপ, দেখুন: techonthenet.com/sql_server/primary_keys.php
দেজন

1
@ নিকোলাস বারবুলেসো ওরাকলে? টেবিলটি কিছু_ টেবিল অক্ষম নিয়ন্ত্রণ কিছু_ টেবিল_এফকে 1; // কিছু স্টাফ করুন যা টেবিলে কিছুটা সীমাবদ্ধতা লঙ্ঘন করবে কিছু_ টেবিল সক্ষম করুন কিছু_সামান্য_ফেক 1;
স্টিভ সুইসবার্গ

237
-- Disable the constraints on a table called tableName:
ALTER TABLE tableName NOCHECK CONSTRAINT ALL

-- Re-enable the constraints on a table called tableName:
ALTER TABLE tableName WITH CHECK CHECK CONSTRAINT ALL
---------------------------------------------------------

-- Disable constraints for all tables:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

-- Re-enable constraints for all tables:
EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'
---------------------------------------------------------

1
@ কেভিনক নং যতক্ষণ আপনি কনসেন্টেন্ট হন তাতে কিছু আসে যায় না।
পো-টা-টু

2
উদ্ধৃত শনাক্তকারীদের ব্যবহার করা আমি এএনএসআই স্ট্যান্ডার্ড সেটিং বিশ্বাস করি যার অর্থ আপনার সেগুলি স্ট্রিংয়ের জন্য ব্যবহার করা উচিত নয়। ধারাবাহিক হওয়ার সাথে কিছু করার নেই। দেখতে stackoverflow.com/questions/1992314/...
kevinc

1
প্রক্রিয়া জন্য ধন্যবাদ! এবং বিটিডাব্লু এটির সঠিক কেসিং হ'ল "এসপি_এমএসফেরোচেটেবল" (এমএস বড় হাতের অক্ষর)। ধন্যবাদ!
সিলু

3
এটি প্রশ্নের সঠিক উত্তর হিসাবে সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত ছিল। শুধু তাই নয়, তবে @ ডোনাল একটি ওয়াইল্ডকার্ড সংস্করণ অন্তর্ভুক্ত করেছে যা আমার জন্য খুব সহায়ক ছিল helpful
ম্যাট জ্যাকসন

2
পুনরায় সক্ষম বিট জন্য ধন্যবাদ। বিশেষত দ্বিগুণ check checkযা বহু লোক ভুলে যায় !!
অ্যালেক্স

57

এবং, আপনি যদি যাচাই করতে চান যে আপনি নিজের সম্পর্কগুলি ভেঙে ফেলেছেন এবং অনাথদের পরিচয় করিয়ে দিয়েছেন, একবার আপনি নিজের চেকগুলিকে পুনরায় সজ্জিত করেছেন, অর্থাৎ

ALTER TABLE foo CHECK CONSTRAINT ALL

অথবা

ALTER TABLE foo CHECK CONSTRAINT FK_something

তারপরে আপনি আবার দৌড়াতে পারেন এবং কোনও চেক করা কলামের মতো আপডেট করতে পারেন:

UPDATE myUpdatedTable SET someCol = someCol, fkCol = fkCol, etc = etc

এবং এই সময়ে যে কোনও ত্রুটি সীমাবদ্ধতাগুলি পূরণ করতে ব্যর্থতার কারণে হবে।


11
আরও ভাল উপায় চেক চেক কনট্রেনট এফ কে_সামিং
কোডি কনিওর

1
ALL TABLE FO CHONK CONSTRAINT ALL বা ALTER TABLE FO CONSTRAINT চেক করুন ডেটা পরীক্ষা না করে কোনও কিছু সীমাবদ্ধতা সক্ষম করবে এবং এর অর্থ হ'ল প্রতিবন্ধকতা অবিশ্বস্ত হবে (is_no_trusted = 1, is_disabled = 0)।
বোগদান সাহলেয়ান

16

আপনি আসলে একটি একক এসকিউএল কমান্ডে সমস্ত ডাটাবেস সীমাবদ্ধতাগুলি অক্ষম করতে পারেন এবং তাদের অন্য একক কমান্ড কল করে পুনরায় সক্ষম করতে পারেন। দেখা:

আমি বর্তমানে এসকিউএল সার্ভার 2005 এর সাথে কাজ করছি তবে আমি প্রায় নিশ্চিত যে এই পদ্ধতিটি এসকিউএল 2000 এর সাথেও কাজ করেছে


0

সমস্ত বিদেশী কী অক্ষম ও সক্ষম করা ab

CREATE PROCEDURE pr_Disable_Triggers_v2
    @disable BIT = 1
AS
    DECLARE @sql VARCHAR(500)
        ,   @tableName VARCHAR(128)
        ,   @tableSchema VARCHAR(128)

    -- List of all tables
    DECLARE triggerCursor CURSOR FOR
        SELECT  t.TABLE_NAME AS TableName
            ,   t.TABLE_SCHEMA AS TableSchema
        FROM    INFORMATION_SCHEMA.TABLES t
        ORDER BY t.TABLE_NAME, t.TABLE_SCHEMA

    OPEN    triggerCursor
    FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema
    WHILE ( @@FETCH_STATUS = 0 )
    BEGIN

        SET @sql = 'ALTER TABLE ' + @tableSchema + '.[' + @tableName + '] '
        IF @disable = 1
            SET @sql = @sql + ' DISABLE TRIGGER ALL'
        ELSE
            SET @sql = @sql + ' ENABLE TRIGGER ALL'

        PRINT 'Executing Statement - ' + @sql
        EXECUTE ( @sql )

        FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema

    END

    CLOSE triggerCursor
    DEALLOCATE triggerCursor

প্রথমত, বিদেশীকি কার্সার কার্সারটিকে SELECT বিবৃতি হিসাবে ঘোষণা করা হয় যা বিদেশী কীগুলির তালিকা এবং তাদের সারণির নাম সংগ্রহ করে। এর পরে, কার্সারটি খোলে এবং প্রাথমিক FETCH বিবৃতি কার্যকর করা হয়। এই FETCH বিবৃতিটি প্রথম সারির ডেটা স্থানীয় ভেরিয়েবল @ ফায়ারফাইনকি-নেম এবং @ টেবিলনামে পড়বে। কার্সারের মাধ্যমে লুপ করার সময় আপনি 0 টি মানের জন্য @@ FETCH_STATUS টি পরীক্ষা করতে পারেন, যা ইঙ্গিত দেয় যে আনতে সফল হয়েছিল। এর অর্থ লুপটি এগিয়ে যেতে থাকবে যাতে এটি সারি থেকে প্রতিটি ক্রমাগত বিদেশী কী পেতে পারে। সংযোগে সমস্ত কার্সারের জন্য @@ FETCH_STATUS উপলব্ধ। সুতরাং আপনি যদি একাধিক কার্সারের মাধ্যমে লুপিং করে থাকেন তবে FETCH বিবৃতি অনুসরণ করার সাথে সাথেই বিবৃতিতে @@ FETCH_STATUS এর মান পরীক্ষা করা গুরুত্বপূর্ণ। @@ FETCH_STATUS সংযোগের ক্ষেত্রে সাম্প্রতিকতম FETCH অপারেশনের স্থিতি প্রতিফলিত করবে। @@ FETCH_STATUS এর জন্য বৈধ মানগুলি হ'ল:

0 = FETCH সফল ছিল
-1 = FETCH ব্যর্থ ছিল
-2 = যে সারিটি পাওয়া গেছে তা অনুপস্থিত

লুপের অভ্যন্তরে, কোডটি বিদেশী কী সীমাবদ্ধতা অক্ষম করা বা সক্ষম করতে হবে (CHECK বা NOCHECK কীওয়ার্ড ব্যবহার করে) উদ্দেশ্যটি নির্ভর করে ভিন্নভাবে ALTER TABLE কমান্ডটি তৈরি করে। বিবৃতিটি তখন একটি বার্তা হিসাবে মুদ্রিত হয় যাতে এর অগ্রগতি লক্ষ্য করা যায় এবং তারপরে বিবৃতি কার্যকর করা হয়। অবশেষে, যখন সমস্ত সারি পুনরায় পুনরুক্ত করা হয়, সঞ্চিত প্রক্রিয়া কার্সারটি বন্ধ করে এবং ডিলোকোট করে।

এমএসডিএন ম্যাগাজিন থেকে নিষ্ক্রিয় সীমাবদ্ধতা এবং ট্রিগারগুলি দেখুন

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