Amazon RDS PostgreSQL में विदेशी कुंजियों को अस्थायी रूप से अक्षम कैसे करें?


10

मैं मौजूदा परीक्षण वातावरण को Amazon RDS PostgreSQL में स्थानांतरित कर रहा हूं। परीक्षण की रूपरेखा में कुछ सारणियों में डेटा को पहले की स्थिति में पुनः लोड करने की सुविधा है। इसके लिए यह विदेशी कुंजियों को निष्क्रिय करता है, मौजूदा डेटा को हटाता है, राज्य को बचाता है और विदेशी कुंजियों को फिर से सक्षम बनाता है।

वर्तमान में, परीक्षण रूपरेखा सभी ट्रिगर को अक्षम करके विदेशी कुंजियों को निष्क्रिय करती है (बेशक, इसके लिए सुपरयुसर की आवश्यकता होती है)

alter table tablename disable trigger all;

RDS पर, यह विफल रहता है:

त्रुटि: अनुमति अस्वीकृत: "RI_ConstraintTrigger_a_20164" एक सिस्टम ट्रिगर है

मैं Amazon RDS PostgreSQL में अस्थायी रूप से विदेशी कुंजियों को कैसे निष्क्रिय कर सकता हूं?

नोट: इसी तरह का सवाल पहले ही पूछा गया है ( आरडीएस पर पोस्टग्रेसीक्यू: एफके बाधाओं के साथ डेटा आयात कैसे करें? ) लेकिन यह विशेष रूप से ऑफ़लाइन आयात के बारे में था और समाधान ऑफ़लाइन आयात के लिए भी विशिष्ट है।


शायद यह स्टैकओवरफ्लो प्रश्न होना चाहिए?
पिओटर फाइंडसेन

असहमत - यह बहुत स्पष्ट रूप से डेटाबेस प्रशासन से संबंधित है।
वेर्रेस

अब आप FK को कैसे निष्क्रिय करते हैं? आप इसे आरडीएस पर अलग होने की उम्मीद क्यों करते हैं? इसके अलावा, अपने आप को क्यों नहीं आज़माएं?
dezso

@dezso, टिप्पणी के लिए धन्यवाद। ज़रूर, मैंने उस कोड को जोड़ा जो गैर-आरडीएस पोस्टग्रेक्यूएल पर उपयोग किया जाता है।
पायोटर फाइंडसेन

अरे हाँ, इस तरह से यह काम नहीं करेगा। लेकिन कैसे FK बाधाओं को छोड़ने और पुनः बनाने के बारे में?
dezso

जवाबों:


11

session_replication_role

मुझे विदेशी चाबियों को निष्क्रिय करने का एक वैकल्पिक तरीका मिला - https://stackoverflow.com/a/18709987

set session_replication_role = replica;

और उन्हें फिर से सक्षम करना

set session_replication_role = default;

यह आरडीएस पर काम करता है, लेकिन फिर भी असामान्य विशेषाधिकारों की आवश्यकता होती है (अर्थात डिफ़ॉल्ट रूप से स्वीकृत नहीं)।

छोड़ने और FKs को फिर से बनाना

वैकल्पिक समाधान है, जैसा कि टिप्पणियों में सुझाव दिया गया है, अस्थायी रूप से FKs को छोड़ने के लिए। यह अतिरिक्त लाभ लाता है कि जब एफके फिर से सक्षम होते हैं तो डेटा सत्यापित होता है।

छोड़ने

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 $$;

पुनः

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 $$;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.