پوسٹگری ایس کیو ایل میں قطار کی سطح کی حفاظت کو نافذ کرنے پر ایک مطالعہ

کی تکمیل کے طور پر PostgreSQL ذخیرہ شدہ افعال کی سطح پر کاروباری منطق کو نافذ کرنے پر ایک مطالعہ и بنیادی طور پر ایک تفصیلی جواب کے لیے پر تبصرہ.

دستاویزات میں نظریاتی حصہ کو اچھی طرح سے بیان کیا گیا ہے۔ پوسٹگری ایس کیو ایل - قطار کے تحفظ کی پالیسیاں. ذیل میں ایک چھوٹا سا عملی نفاذ ہے۔ مخصوص کاروباری کام - حذف شدہ ڈیٹا کو چھپانا۔ نفاذ کے لیے وقف خاکہ RLS کا استعمال کرتے ہوئے رول ماڈلنگ الگ سے پیش کیا.

پوسٹگری ایس کیو ایل میں قطار کی سطح کی حفاظت کو نافذ کرنے پر ایک مطالعہ

مضمون میں کوئی نئی بات نہیں، کوئی مخفی معنی یا خفیہ علم نہیں۔ ایک نظریاتی خیال کے عملی نفاذ کے بارے میں صرف ایک خاکہ۔ اگر کسی کو دلچسپی ہو تو پڑھ لے۔ اگر آپ دلچسپی نہیں رکھتے تو اپنا وقت ضائع نہ کریں۔

مسئلہ کی تشکیل

موضوع کے علاقے میں گہرائی میں ڈوبنے کے بغیر، مختصر طور پر، مسئلہ کو مندرجہ ذیل طور پر تشکیل دیا جا سکتا ہے: ایک میز ہے جو ایک مخصوص کاروباری ادارے کو نافذ کرتی ہے۔ ٹیبل میں موجود قطاروں کو حذف کیا جا سکتا ہے، لیکن قطاروں کو جسمانی طور پر حذف نہیں کیا جا سکتا؛ انہیں چھپایا جانا چاہیے۔

کیونکہ یہ کہا جاتا ہے: "کچھ بھی حذف نہ کریں، صرف اس کا نام تبدیل کریں۔ انٹرنیٹ ہر چیز کو اسٹور کرتا ہے"

راستے میں، یہ مشورہ دیا جاتا ہے کہ اس ہستی کے ساتھ کام کرنے والے موجودہ ذخیرہ شدہ فنکشنز کو دوبارہ نہ لکھیں۔

اس تصور کو عملی جامہ پہنانے کے لیے، ٹیبل میں یہ وصف ہے۔ is_deleted. پھر سب کچھ آسان ہے - آپ کو یہ یقینی بنانا ہوگا کہ کلائنٹ صرف وہی لائنیں دیکھ سکتا ہے جس میں وصف ہے۔ is_deleted جھوٹا میکانزم کس کے لیے استعمال ہوتا ہے؟ قطار کی سطح کی حفاظت۔

Реализация

ایک الگ کردار اور اسکیما بنائیں

CREATE ROLE repos;
CREATE SCHEMA repos;

ہدف کی میز بنائیں

CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos

آن کر دو صف کی سطح کی حفاظت

ALTER TABLE repos.file  ENABLE ROW LEVEL SECURITY ;
CREATE POLICY file_invisible_deleted  ON repos.file FOR ALL TO dba_role USING ( NOT is_deleted );
GRANT ALL ON TABLE repos.file to dba_role ;
GRANT USAGE ON SCHEMA repos TO dba_role ;

سروس فنکشن - ٹیبل میں ایک قطار کو حذف کرنا

CREATE OR REPLACE repos.delete( curr_id repos.file.id%TYPE)
RETURNS integer AS $$
BEGIN
...
UPDATE repos.file
SET is_del = TRUE 
WHERE id = curr_id ; 
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

کاروباری تقریب - ایک دستاویز کو حذف کرنا

CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM  repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

نتائج

کلائنٹ دستاویز کو حذف کرتا ہے۔

SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );

حذف کرنے کے بعد، کلائنٹ دستاویز نہیں دیکھتا ہے۔

SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)

لیکن ڈیٹا بیس میں دستاویز کو حذف نہیں کیا جاتا ہے، صرف وصف تبدیل کیا جاتا ہے۔ is_del

psql -d my_db
SELECT  id, name , is_del FROM repos.file ;
id |  name  | is_del
--+---------+------------
 1 |  test_1 | t
(1 row)

جو مسئلہ بیان میں مطلوب تھا۔

کل

اگر موضوع دلچسپ ہے، تو اگلے مطالعہ میں آپ Row Level Security کا استعمال کرتے ہوئے ڈیٹا تک رسائی کو الگ کرنے کے لیے رول پر مبنی ماڈل کو لاگو کرنے کی مثال دکھا سکتے ہیں۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں