অ্যামাজন আরডিএস পোস্টগ্রিএসকিউএল-এ কীভাবে সাময়িকভাবে বিদেশী কীগুলি অক্ষম করবেন?


10

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

বর্তমানে, পরীক্ষার কাঠামোটি সমস্ত ট্রিগারগুলি অক্ষম করে বিদেশী কীগুলি অক্ষম করে (অবশ্যই এটির জন্য সুপারজার প্রয়োজন):

alter table tablename disable trigger all;

আরডিএসে, এটি এতে ব্যর্থ হয়:

ত্রুটি: অনুমতি অস্বীকার করেছে: "RI_ConstraintTrigger_a_20164" একটি সিস্টেম ট্রিগার

আমি অ্যামাজন আরডিএস পোস্টগ্রিজ এসকিউএল-এ কীভাবে সাময়িকভাবে বিদেশী কীগুলি অক্ষম করতে পারি?

দ্রষ্টব্য: অনুরূপ প্রশ্ন ইতিমধ্যে জিজ্ঞাসা করা হয়েছে ( আরডিএসে পোস্টগ্রিএসকিউএল: এফকে সীমাবদ্ধতার সাথে কীভাবে বাল্ক আমদানির ডেটা? ) তবে এটি বিশেষত অফলাইন আমদানি সম্পর্কে ছিল এবং সমাধানটি অফলাইন আমদানির ক্ষেত্রেও নির্দিষ্ট।


সম্ভবত এটি একটি স্ট্যাকওভারফ্লো প্রশ্ন হওয়া উচিত?
পাইওটার ফাইন্ডেইনসেন

অসম্মতি - এটি খুব স্পষ্টভাবে ডাটাবেস প্রশাসনের সাথে সম্পর্কিত।
ভ্যারেস

কীভাবে আপনি এখন এফকে অক্ষম করবেন? আপনি এটি আরডিএসে আলাদা হওয়ার আশা করছেন কেন? এছাড়াও, কেন নিজেকে চেষ্টা করবেন না?
dezso

@ ডেজো, মন্তব্যের জন্য ধন্যবাদ। অবশ্যই, আমি কোডটি যুক্ত করেছি যা নন-আরডিএস পোস্টগ্রিজ এসকিউএল ব্যবহৃত হয়।
পাইওটর ফাইন্ডেন 21

ওহ হ্যাঁ, এইভাবে এটি কাজ করবে না। তবে কীভাবে এফকে সীমাবদ্ধতাগুলি ফেলে দেওয়া এবং পুনরুদ্ধার করা যায়?
dezso

উত্তর:


11

session_replication_role

বিদেশী কীগুলি অক্ষম করার একটি বিকল্প উপায় আমি পেয়েছি - https://stackoverflow.com/a/18709987

set session_replication_role = replica;

এবং তাদের সাথে পুনরায় সক্রিয়

set session_replication_role = default;

এটি আরডিএসে কাজ করে তবে এখনও অস্বাভাবিক সুযোগ-সুবিধাগুলি প্রয়োজন (যেমন ডিফল্টরূপে মঞ্জুর করা হয়নি)।

এফকে ছেড়ে দেওয়া এবং পুনরুদ্ধার করা

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

বাতিল

create table if not exists dropped_foreign_keys (
        seq bigserial primary key,
        sql text
);

do $$ declare t record;
begin
    for t in select conrelid::regclass::varchar table_name, conname constraint_name,
            pg_catalog.pg_get_constraintdef(r.oid, true) constraint_definition
            from pg_catalog.pg_constraint r
            where r.contype = 'f'
            -- current schema only:
            and r.connamespace = (select n.oid from pg_namespace n where n.nspname = current_schema())
        loop

        insert into dropped_foreign_keys (sql) values (
            format('alter table %s add constraint %s %s',
                quote_ident(t.table_name), quote_ident(t.constraint_name), t.constraint_definition));

        execute format('alter table %s drop constraint %s', quote_ident(t.table_name), quote_ident(t.constraint_name));

    end loop;
end $$;

recreating

do $$ declare t record;
begin
    -- order by seq for easier troubleshooting when data does not satisfy FKs
    for t in select * from dropped_foreign_keys order by seq loop
        execute t.sql;
        delete from dropped_foreign_keys where seq = t.seq;
    end loop;
end $$;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.