Kama nyongeza ya
Sehemu ya kinadharia imeelezewa vizuri katika nyaraka
Hakuna kitu kipya katika makala, hakuna maana iliyofichwa au ujuzi wa siri. Mchoro tu kuhusu utekelezaji wa vitendo wa wazo la kinadharia. Ikiwa mtu yeyote ana nia, soma. Ikiwa hupendi, usipoteze wakati wako.
Taarifa ya tatizo
Bila kupiga mbizi kwa undani katika eneo la somo, kwa ufupi, shida inaweza kupangwa kama ifuatavyo: Kuna jedwali linalotumia chombo fulani cha biashara. Safu mlalo kwenye jedwali zinaweza kufutwa, lakini safu mlalo haziwezi kufutwa; lazima zifichwe.
Kwa maana inasemwa: "Usifute chochote, ipe jina tena. Mtandao huhifadhi kila kitu"
Njiani, inashauriwa usiandike tena vitendaji vilivyohifadhiwa ambavyo vinafanya kazi na chombo hiki.
Ili kutekeleza dhana hii, meza ina sifa imefutwa. Kisha kila kitu ni rahisi - unahitaji kuhakikisha kwamba mteja anaweza kuona tu mistari ambayo sifa imefutwa uongo Utaratibu unaotumika ni nini? Usalama wa Kiwango cha Safu.
Utekelezaji
Unda jukumu tofauti na schema
CREATE ROLE repos;
CREATE SCHEMA repos;
Unda meza inayolengwa
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Sisi ni pamoja na Usalama wa Kiwango cha Mstari
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 ;
Kazi ya huduma - kufuta safu kwenye jedwali
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;
Kazi ya biashara - kufuta hati
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Matokeo
Mteja anafuta hati
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Baada ya kufutwa, mteja haoni hati
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Lakini katika hifadhidata hati haijafutwa, sifa tu inabadilishwa ni_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Ambayo ndiyo ilihitajika katika taarifa ya tatizo.
Jumla ya
Ikiwa mada inavutia, katika somo linalofuata unaweza kuonyesha mfano wa kutekeleza kielelezo dhima cha kutenganisha ufikiaji wa data kwa kutumia Row Level Security.
Chanzo: mapenzi.com