हाँ, बिलकुल संभव है।
<एच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
के विकल्प के रूप में) दृष्टिकोण)।
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
का उपयोग कर
।