ga qo'shimcha sifatida
Nazariy qism hujjatlarda yaxshi tasvirlangan
Maqolada hech qanday yangilik yo'q, yashirin ma'no yoki maxfiy bilim yo'q. Nazariy fikrni amaliy amalga oshirish haqidagi eskiz. Agar kimdir qiziqsa, o'qing. Agar sizni qiziqtirmasa, vaqtingizni behuda sarflamang.
Muammoni shakllantirish
Mavzu sohasiga chuqur kirmasdan, qisqacha, muammoni quyidagicha shakllantirish mumkin: Muayyan xo'jalik yurituvchi sub'ektni amalga oshiradigan jadval mavjud. Jadvaldagi satrlarni o'chirish mumkin, lekin satrlarni jismoniy o'chirib bo'lmaydi, ular yashirilishi kerak.
Chunki shunday deyilgan: “Hech narsani o'chirmang, shunchaki nomini o'zgartiring. Internet hamma narsani saqlaydi"
Shu bilan birga, ushbu ob'ekt bilan ishlaydigan mavjud saqlangan funktsiyalarni qayta yozmaslik tavsiya etiladi.
Ushbu kontseptsiyani amalga oshirish uchun jadval atributiga ega o'chirildi. Keyin hamma narsa oddiy - mijoz faqat atribut mavjud bo'lgan satrlarni ko'rishiga ishonch hosil qilishingiz kerak o'chirildi yolg'on Mexanizm nima uchun ishlatiladi? Qator darajasidagi xavfsizlik.
Реализация
Alohida rol va sxema yarating
CREATE ROLE repos;
CREATE SCHEMA repos;
Maqsadli jadvalni yarating
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Yoqing Qator darajadagi xavfsizlik
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 ;
Xizmat funktsiyasi — jadvaldagi qatorni oʻchirish
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;
Biznes funktsiyasi - hujjatni o'chirish
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Natijalar
Mijoz hujjatni o'chiradi
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
O'chirishdan keyin mijoz hujjatni ko'rmaydi
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Ammo ma'lumotlar bazasida hujjat o'chirilmaydi, faqat atribut o'zgartiriladi is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Muammo bayonotida nima talab qilingan edi.
Xulosa
Agar mavzu qiziqarli bo'lsa, keyingi ishda siz Row Level Security yordamida ma'lumotlarga kirishni ajratish uchun rolga asoslangan modelni amalga oshirish misolini ko'rsatishingiz mumkin.
Manba: www.habr.com