माइग्रेशन के लिए PostgreSQL विदेशी कुंजी जाँच अक्षम करें


92

मैं बहुत सारे माइग्रेशन बना रहा हूं जिनके पास PostgreSQL 9.4 में विदेशी चाबियाँ हैं।

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

MySQL में, मैं SET FOREIGN_KEY_CHECKS = 0;अपनी माइग्रेशन फ़ाइल के शीर्ष पर जोड़कर इसे सरल बना सकता हूं। मैं यह केवल अस्थायी रूप से माइग्रेशन कोड की लंबाई के लिए PostgresSQL में कैसे कर सकता हूं?

इसके लिए लारवेल स्कीमा बिल्डर का उपयोग करते हुए बीटीडब्लू।

जवाबों:


83

PostgreSQL किसी भी कॉन्फ़िगरेशन विकल्प का समर्थन नहीं करता है, लेकिन एक और संभावना है।

postgres=# \d b
        Table "public.b"
┌────────┬─────────┬───────────┐
│ Column │  Type   │ Modifiers │
╞════════╪═════════╪═══════════╡
│ id     │ integer │           │
└────────┴─────────┴───────────┘
Foreign-key constraints:
    "b_id_fkey" FOREIGN KEY (id) REFERENCES a(id) DEFERRABLE

Postgres में संदर्भित अखंडता ट्रिगर्स द्वारा कार्यान्वित की जाती है, और आप टेबल पर ट्रिगर्स को अक्षम कर सकते हैं। इस पद्धति से आप किसी भी डेटा (जोखिम) को अपलोड कर सकते हैं, लेकिन यह काफी तेज़ है - क्योंकि बड़े डेटा पर चेक महंगा है। और अगर आपका अपलोड सुरक्षित है, तो आप कर सकते हैं।

BEGIN;
ALTER TABLE b DISABLE TRIGGER ALL;
-- now the RI over table b is disabled
ALTER TABLE b ENABLE TRIGGER ALL;
COMMIT;

अगली संभावना आस्थगित बाधाओं का उपयोग कर रही है। यह कदम समय की कमी की जाँच करता है। इसलिए आपको INSERTआदेशों का सम्मान नहीं करना चाहिए :

ALTER TABLE b ALTER CONSTRAINT b_id_fkey DEFERRABLE;

BEGIN
postgres=# SET CONSTRAINTS b_id_fkey DEFERRED;
SET CONSTRAINTS
postgres=# INSERT INTO b VALUES(100); -- this is not in a table
INSERT 0 1
postgres=# INSERT INTO b VALUES(10);
INSERT 0 1 
postgres=# COMMIT;
ERROR:  insert or update on table "b" violates foreign key constraint "b_id_fkey"
DETAIL:  Key (id)=(100) is not present in table "a".

यह विधि आपके लिए पसंद की जानी चाहिए, क्योंकि सम्मिलित डेटा की जांच की जाएगी।


2
किसी कारण से, यह मेरे लिए एक बार काम किया और फिर बिल्कुल नहीं। मैं aurora पोस्ट कर रहा हूँ, जहाँ वे super userभूमिका को बंद कर देते हैं ताकि ग्राहक प्रतिकृति सेटिंग्स को गड़बड़ न कर सकें। ऐसा लगता है कि मुझे कुछ सिस्टम ट्रिगर्स को निष्क्रिय करने के लिए एक सुपर उपयोगकर्ता होना चाहिए। (मैं वर्तमान में अपने व्यवस्थापक खाते का उपयोग कर रहा हूं जो कि स्वामी भी हैं- मुझे यकीन नहीं है कि यह एक बार क्यों काम किया।) प्रतिकृति विकल्प सेट करना भी एक व्यवहार्य विकल्प नहीं है, क्योंकि इसके लिए भी super userभूमिका की आवश्यकता होती है । मेरा एकमात्र विकल्प विदेशी कुंजियों को गिराना और पुनः बनाना प्रतीत होता है ...
ps2goat

मुझे भी। काम कर रहे DISABLE TRIGGER ALLहैं, लेकिन इसका कोई प्रभाव नहीं है। मुझे कोई चेतावनी भी नहीं मिलती। इसे सिर्फ नजरअंदाज किया जाता है।
जयरजो

Amazon RDS पर, यह निम्न त्रुटि देता है:> अनुमति अस्वीकृत: "RI_ConstraintTrigger_a_23031" एक सिस्टम ट्रिगर है इसलिए यह नुस्खा हर मामले के लिए नहीं है, दुर्भाग्य से :)
kolypto

स्थानीय डीबी पर भी त्रुटि। डेटाबेस के लिए सभी विशेषाधिकार रखने वाले उपयोगकर्ता के साथ, ** अनुमति अस्वीकार कर दी गई: "RI_ConstraintTrigger_a_16564" एक सिस्टम ट्रिगर **
Solo.dmitry

154

प्रवासन के लिए, इसके साथ सभी ट्रिगर अक्षम करना आसान है:

SET session_replication_role = 'replica';

और माइग्रेशन के बाद सभी के साथ पुन: प्रयोज्य

SET session_replication_role = 'origin';

3
पवित्र गाय, क्या यह हाथ में विशिष्ट कार्य के लिए अधिक सरल और अधिक उपयुक्त है। (हाँ।)
आईजोसफ

10
शब्द सावधानी: इसके लिए सुपरसुसर विशेषाधिकारों की आवश्यकता होती है। "सभी की लागत सेट करें" का प्रयास करें।
JJC

9
मैं काम कर रहा हूं 10.4और यह उपरोक्त कथन काम नहीं कर रहा है।
स्टीफन

2
क्या कोई इस पद्धति के खतरों / जोखिमों को रेखांकित कर पाएगा और किन परिदृश्यों में इसका उपयोग किया जाना चाहिए और जोखिमों को कम कैसे किया जाए? अगर यह एक खराब प्रथा मानी जाए तो सबसे अच्छा अभ्यास क्या है?
कर्ण

6
Btw, यह पैरामीटर डेटाबेस पैरामीटर समूह में AWS RDS में सेट किया जा सकता है और db को पुनरारंभ किए बिना लागू किया जा सकता है! बहुत उपयोगी है अगर आप मौजूदा स्कीमा और बनाई गई बाधाओं के साथ एक खाली डीबी में डीएमएस का उपयोग कर रहे हैं।
माइक एटलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.