کی تکمیل کے طور پر
دستاویزات میں نظریاتی حصہ کو اچھی طرح سے بیان کیا گیا ہے۔
مضمون میں کوئی نئی بات نہیں، کوئی مخفی معنی یا خفیہ علم نہیں۔ ایک نظریاتی خیال کے عملی نفاذ کے بارے میں صرف ایک خاکہ۔ اگر کسی کو دلچسپی ہو تو پڑھ لے۔ اگر آپ دلچسپی نہیں رکھتے تو اپنا وقت ضائع نہ کریں۔
مسئلہ کی تشکیل
موضوع کے علاقے میں گہرائی میں ڈوبنے کے بغیر، مختصر طور پر، مسئلہ کو مندرجہ ذیل طور پر تشکیل دیا جا سکتا ہے: ایک میز ہے جو ایک مخصوص کاروباری ادارے کو نافذ کرتی ہے۔ ٹیبل میں موجود قطاروں کو حذف کیا جا سکتا ہے، لیکن قطاروں کو جسمانی طور پر حذف نہیں کیا جا سکتا؛ انہیں چھپایا جانا چاہیے۔
کیونکہ یہ کہا جاتا ہے: "کچھ بھی حذف نہ کریں، صرف اس کا نام تبدیل کریں۔ انٹرنیٹ ہر چیز کو اسٹور کرتا ہے"
راستے میں، یہ مشورہ دیا جاتا ہے کہ اس ہستی کے ساتھ کام کرنے والے موجودہ ذخیرہ شدہ فنکشنز کو دوبارہ نہ لکھیں۔
اس تصور کو عملی جامہ پہنانے کے لیے، ٹیبل میں یہ وصف ہے۔ 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