PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

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

हाँ, बिलकुल संभव है।

<एच4>1. आम तौर पर UPDATE की अनुमति न दें करने के लिए A

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

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

यह postgres . जैसे सुपरयूज़र छोड़ देता है जो इन नीच प्रतिबंधों की उपेक्षा करते हैं। A . पर अपने ट्रिगर-फ़ंक्शन के अंदर उन्हें पकड़ें साथ pg_has_role() कोड> :

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

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

आप गैर-सुपरयूज़र को इसी तरह से पकड़ सकते हैं (REVOKE के विकल्प के रूप में) दृष्टिकोण)।

<एच4>2. UPDATE की अनुमति दें डेमन भूमिका के लिए

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

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

टेबल पर ट्रिगर फंक्शन बनाएं B और C , स्वामित्व वाली इस डेमॉन भूमिका के द्वारा और SECURITY DEFINER . के साथ . विवरण:

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

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

सरल 1:1 निर्भरता के लिए, आप विदेशी कुंजी बाधाएं (अतिरिक्त) ON UPDATE CASCADE का उपयोग कर




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आप कैसे सुनिश्चित करते हैं कि लॉगिंग टेबल से मान अन्य तालिकाओं में वस्तुओं से मेल खाते हैं?

  2. केवल आज के (आधी रात से) टाइमस्टैम्प चुनें

  3. PostgreSQL विंडो फ़ंक्शंस शून्य मानों पर ध्यान न दें

  4. प्राथमिक के साथ कोई कनेक्शन पूल नहीं मिला

  5. Postgresql तालिकाएँ मौजूद हैं, लेकिन क्वेरी करते समय संबंध प्राप्त करना मौजूद नहीं है