Isip komplemento sa
Ang teoretikal nga bahin maayo nga gihulagway sa dokumentasyon
Walay bag-o sa artikulo, walay tinago nga kahulogan o sekreto nga kahibalo. Usa lang ka sketch bahin sa praktikal nga pagpatuman sa usa ka teoretikal nga ideya. Kung adunay interesado, basaha kini. Kung dili ka interesado, ayaw usiki ang imong oras.
Pagbuot sa problema
Kung walaβy lawom nga pag-dive sa hilisgutan nga lugar, sa kadali, ang problema mahimong maporma sama sa mosunod: Adunay usa ka lamesa nga nagpatuman sa usa ka piho nga entidad sa negosyo. Ang mga laray sa lamesa mahimong mapapas, apan ang mga laray dili mahimong pisikal nga mapapas; kini kinahanglan itago.
Kay matod pa: βDonβt delete anything, just rename it. Gitipigan sa Internet ang TANAN"
Sa kadugayan, gitambagan nga dili isulat pag-usab ang naa na nga gitipigan nga mga gimbuhaton nga nagtrabaho sa kini nga entidad.
Aron ipatuman kini nga konsepto, ang lamesa adunay hiyas is_deleted. Dayon ang tanan yano ra - kinahanglan nimo nga sigurohon nga ang kliyente makakita lamang sa mga linya diin ang hiyas is_deleted bakak Para sa unsa ang mekanismo nga gigamit? Seguridad sa lebel sa linya.
Pagpatuman
Paghimo og bulag nga papel ug eskema
CREATE ROLE repos;
CREATE SCHEMA repos;
Paghimo sa target nga lamesa
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Padayon Seguridad sa lebel sa linya
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 ;
Serbisyo function β pagtangtang sa usa ka laray sa lamesa
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;
Function sa negosyo - pagtangtang sa usa ka 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;
Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ
Gitangtang sa kliyente ang dokumento
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Human sa pagtangtang, ang kliyente dili makakita sa dokumento
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Apan sa database ang dokumento wala mapapas, ang kinaiya lamang ang giusab is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Nga mao ang gikinahanglan sa pahayag sa problema.
Ang resulta
Kung ang hilisgutan makapaikag, sa sunod nga pagtuon mahimo nimong ipakita ang usa ka pananglitan sa pagpatuman sa usa ka modelo nga gibase sa papel alang sa pagbulag sa pag-access sa datos gamit ang Row Level Security.
Source: www.habr.com