मैंने हाल ही में SQL में पंक्ति-स्तरीय सुरक्षा नीतियों के बारे में सीखा है, और डेटाबेस के अंदर महत्वपूर्ण सुरक्षा तर्क चलाने में सक्षम होने के विचार से प्यार है। हालांकि, मुझे यकीन नहीं है कि आरएलएस नीतियों को अपडेट करने के लिए वर्कफ़्लो को एपीआई कोड को अपडेट करने जितना अच्छा कैसे बनाया जाए।

चूंकि आरएलएस नीतियां अनिवार्य रूप से केवल स्टेटलेस लॉजिक हैं, ऐसा लगता है कि मुझे उन सभी को एक एसक्यूएल स्कीमा फ़ाइल में परिभाषित करने में सक्षम होना चाहिए जिसे गिट में चेक किया गया है और नीतियों को निष्क्रिय रूप से सेट करने के लिए प्रत्येक तैनाती पर चलाया जाता है।

हम drop if exists का उपयोग करके वहां से कुछ रास्ता प्राप्त कर सकते हैं, जैसे:

drop policy if exists "everyone can read" on patterns;
create policy "everyone can read" on patterns for select using (auth.role() = 'anon');

यह बहुत अच्छा लगता है, लेकिन यह वास्तव में घोषणात्मक नहीं है, क्योंकि यह किसी भी नीति को नहीं छोड़ेगा जो अभी भी स्कीमा के पिछले संस्करण से डेटाबेस में मौजूद है। क्या मैं सभी मौजूदा नीतियों को एक टेबल के लिए छोड़ सकता हूं और फिर उन्हें फिर से बना सकता हूं? या इसके बारे में जाने का कोई और तरीका है?

1
Kevin Taylor 2 सितंबर 2021, 08:32

2 जवाब

सबसे बढ़िया उत्तर

आपके पास दो विकल्प हैं:

  • एक टेबल पर सभी नीतियों के लिए क्वेरी pg_policy और उन्हें छोड़ दो

  • अपनी स्कीमा के किसी भी संस्करण में मौजूद सभी नीतियों को छोड़ दें

0
Laurenz Albe 2 सितंबर 2021, 06:53

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

-- Drop all existing policies
do
$$
declare
   rec record;
begin
   for rec in (SELECT tablename, policyname FROM pg_policies)
   loop
     execute 'drop policy "'||rec.policyname||'" on '||rec.tablename;
   end loop;
end;
$$;
1
ktint 4 सितंबर 2021, 07:44