جي مڪمل طور تي
نظرياتي حصو چڱي طرح دستاويز ۾ بيان ڪيو ويو آهي
مضمون ۾ ڪا به نئين ڳالهه نه آهي، ڪا ڳجهي معنيٰ يا ڳجهي ڄاڻ نه آهي. صرف نظرياتي خيال جي عملي عمل جي باري ۾ هڪ خاڪو. جيڪڏهن ڪنهن کي دلچسپي آهي، پڙهي. جيڪڏهن توهان دلچسپي نه آهيو، پنهنجو وقت ضايع نه ڪريو.
مسئلو جي ترتيب
موضوع واري علائقي ۾ گهمڻ کان سواء، مختصر طور تي، مسئلو هن ريت ترتيب ڏئي سگهجي ٿو: اتي ھڪڙو ٽيبل آھي جيڪو ھڪڙي خاص ڪاروباري ادارو کي لاڳو ڪري ٿو. ٽيبل ۾ قطارون ڊهي سگھجن ٿيون، پر قطارون جسماني طور ڊهي نه ٿيون سگھجن؛ انھن کي لڪائڻ گھرجي.
ان لاءِ چيو ويو آهي ته: ”ڪنهن به شيءِ کي نه هٽايو، بس ان جو نالو مٽايو. انٽرنيٽ هر شي کي محفوظ ڪري ٿو"
رستي ۾، اهو مشورو ڏنو ويو آهي ته موجوده محفوظ ڪيل ڪمن کي ٻيهر نه لکجي جيڪي هن اداري سان ڪم ڪن ٿا.
ھن تصور کي لاڳو ڪرڻ لاء، جدول آھي وصف 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)
جيڪو مسئلو بيان ۾ گهربل هو.
نتيجو
جيڪڏهن موضوع دلچسپ آهي، ته ايندڙ مطالعي ۾ توهان رول ليول سيڪيورٽي استعمال ڪندي ڊيٽا جي رسائي کي الڳ ڪرڻ لاءِ ڪردار جي بنياد تي ماڊل لاڳو ڪرڻ جو مثال ڏيکاري سگهو ٿا.
جو ذريعو: www.habr.com