Əlavə olaraq
Nəzəri hissə sənədlərdə yaxşı təsvir edilmişdir
Məqalədə yeni heç nə yoxdur, gizli məna və ya gizli bilik yoxdur. Sadəcə nəzəri fikrin praktiki həyata keçirilməsi haqqında eskiz. Kim maraqlanırsa oxusun. Əgər maraqlanmırsınızsa, vaxtınızı boş yerə sərf etməyin.
Problem problemi
Mövzu sahəsinə dərindən girmədən, qısaca olaraq problemi aşağıdakı kimi formalaşdırmaq olar: Müəyyən bir sahibkarlıq subyektini həyata keçirən bir cədvəl var. Cədvəldəki sətirlər silinə bilər, lakin sətirlər fiziki olaraq silinə bilməz, onlar gizlədilməlidir.
Çünki deyilir: “Heç nəyi silməyin, sadəcə adını dəyişin. İnternet hər şeyi saxlayır"
Yol boyu, bu qurumla işləyən mövcud saxlanılan funksiyaları yenidən yazmamaq məsləhətdir.
Bu konsepsiyanı həyata keçirmək üçün cədvəl atributuna malikdir silindi. Sonra hər şey sadədir - müştərinin yalnız atributun olduğu sətirləri görə biləcəyinə əmin olmaq lazımdır silindi yalan Mexanizm nə üçün istifadə olunur? Sıra Səviyyə Təhlükəsizlik.
Tətbiq
Ayrı bir rol və sxem yaradın
CREATE ROLE repos;
CREATE SCHEMA repos;
Hədəf cədvəlini yaradın
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Daxildir Sıra Səviyyə Təhlükəsizliyi
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 ;
Xidmət funksiyası — cədvəldəki sıranın silinməsi
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 funksiyası - sənədin silinməsi
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Tapıntılar
Müştəri sənədi silir
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Silindikdən sonra müştəri sənədi görmür
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Amma verilənlər bazasında sənəd silinmir, yalnız atribut dəyişdirilir is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Problem bəyanatında tələb olunan budur.
Ümumi
Mövzu maraqlıdırsa, növbəti araşdırmada siz Row Level Security-dən istifadə edərək verilənlərə girişi ayırmaq üçün rol əsaslı modelin həyata keçirilməsi nümunəsini göstərə bilərsiniz.
Mənbə: www.habr.com