Bilang pandagdag sa
Ang teoretikal na bahagi ay mahusay na inilarawan sa dokumentasyon
Walang bago sa artikulo, walang nakatagong kahulugan o lihim na kaalaman. Isang sketch lamang tungkol sa praktikal na pagpapatupad ng isang teoretikal na ideya. Kung may interesado, basahin ito. Kung hindi ka interesado, huwag mag-aksaya ng oras.
Pahayag ng problema
Nang walang malalim na pagsisid sa lugar ng paksa, sa madaling sabi, ang problema ay maaaring mabalangkas tulad ng sumusunod: Mayroong isang talahanayan na nagpapatupad ng isang partikular na entity ng negosyo. Maaaring tanggalin ang mga hilera sa talahanayan, ngunit ang mga hilera ay hindi maaaring pisikal na tanggalin; dapat silang itago.
Dahil sabi nga: βHuwag magtanggal ng kahit ano, palitan mo lang ng pangalan. Iniimbak ng Internet ang LAHAT"
Kasabay nito, ipinapayong huwag muling isulat ang mga umiiral nang nakaimbak na function na gumagana sa entity na ito.
Upang ipatupad ang konseptong ito, ang talahanayan ay may katangian is_deleted. Pagkatapos ang lahat ay simple - kailangan mong tiyakin na makikita lamang ng kliyente ang mga linya kung saan ang katangian is_deleted mali Para saan ang mekanismong ginagamit? Seguridad sa Antas ng Row.
Pagpapatupad
Gumawa ng hiwalay na tungkulin at schema
CREATE ROLE repos;
CREATE SCHEMA repos;
Lumikha ng target na talahanayan
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Isinasama namin Seguridad sa Antas ng Hilera
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 ;
Pag-andar ng serbisyo β pagtanggal ng row sa table
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;
Pag-andar ng negosyo β pagtanggal ng dokumento
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Natuklasan
Tinatanggal ng kliyente ang dokumento
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Pagkatapos ng pagtanggal, hindi nakikita ng kliyente ang dokumento
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Ngunit sa database ang dokumento ay hindi tinanggal, tanging ang katangian ay binago ay_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Alin ang kinakailangan sa pahayag ng problema.
Kabuuan
Kung ang paksa ay kawili-wili, sa susunod na pag-aaral maaari kang magpakita ng isang halimbawa ng pagpapatupad ng isang role-based na modelo para sa paghihiwalay ng access ng data gamit ang Row Level Security.
Pinagmulan: www.habr.com