केवल एक ट्रिगर के भीतर से सम्मिलन की अनुमति दें

मैं एसक्यूएल प्रोग्रामिंग के लिए नया हूं, और मुझे ऑनलाइन इस प्रश्न का उत्तर नहीं मिला।

मैं pl/pgsql के साथ काम कर रहा हूं और मैं निम्नलिखित परिणाम प्राप्त करना चाहता हूं:

मेरे पास कुछ विशेषताओं के साथ एक टेबल ए है। मुझे इस तालिका को किसी भी समय अद्यतन रखना है - इस प्रकार जब भी कोई परिवर्तन किया जाता है जो ए के मानों को प्रभावित कर सकता है (अन्य सारणी बी या सी जो ए से संबंधित हैं) - एक ट्रिगर निकाल दिया जाता है जो मानों को अद्यतन करता है (प्रक्रिया में - नए मान ए में डाले जा सकते हैं, साथ ही पुराना मान हटाया जा सकता है)। उसी समय, मैं किसी को सम्मिलित मानों से ए में रोकना चाहता हूं।

मैं जो करना चाहता हूं वह एक ट्रिगर बनाना है जो ए (एनयूएलएल लौटकर) में सम्मिलन को रोक देगा - लेकिन मैं नहीं चाहता हूं कि जब मैं किसी अन्य ट्रिगर से सम्मिलन कर रहा हूं तो यह ट्रिगर कॉल किया जाए - अंत में - ए को केवल एक विशिष्ट ट्रिगर के भीतर से अनुमति दी जाएगी।

जैसा कि मैंने पहले कहा था, मैं एसक्यूएल के लिए नया हूं, और मुझे नहीं पता कि यह भी संभव है या नहीं।

2
जोड़ा संपादित
विचारों: 1

1 उत्तर

हाँ, पूरी तरह से संभव है।

1. Generally disallow UPDATE to A

मैं विशेषाधिकारों के साथ काम करता हूं:

REVOKE ALL ON TABLE A FROM public;  -- and from anybody else who might have it

इससे सुपरसर्स जैसे postgres छोड़ते हैं जो इन कम प्रतिबंधों को अनदेखा करते हैं। अपने ट्रिगर-फ़ंक्शन के अंदर पर pg_has_role() :

IF pg_has_role('postgres', 'member') THEN
   RETURN NULL;
END IF;

जहां postgres एक वास्तविक सुपरसुर है। नोट: यह अन्य सुपरसर्स को भी पकड़ता है, क्योंकि वे हर भूमिका के सदस्य हैं, यहां तक ​​कि अन्य सुपरसर्स भी।

आप एक समान फैशन में गैर-सुपरसर्स को पकड़ सकते हैं ( REVOKE दृष्टिकोण के विकल्प)।

2. डेमॉन भूमिका के लिए <�कोड> अद्यतन </कोड> की अनुमति दें

एक गैर-लॉगिन भूमिका बनाएं, जिसे अपडेट करने की अनुमति है:

CREATE ROLE a_update;
-- GRANT USAGE ON SCHEMA xyz TO a_update;  -- may be needed, too
GRANT UPDATE ON TABLE A TO a_update;

Create trigger functions on tables B and C, owned by this daemon role and with SECURITY DEFINER. Details here:
Is there a way to disable updates/deletes but still allow triggers to perform them?

पर ट्रिगर फ़ंक्शन में जोड़ें:

IF pg_has_role('postgres', 'member') THEN
   RETURN NULL;
ELSIF pg_has_role('a_update', 'member') THEN
   RETURN NEW;
END IF;

सरल 1: 1 निर्भरताओं के लिए, आप विदेशी कुंजी बाधाओं (अतिरिक्त रूप से) <�कोड> अद्यतन कैस्केड का उपयोग कर।

1
जोड़ा