Wek temamkerê
Di belgeyê de beşa teorîk baş tê vegotin
Di gotarê de tiştek nû tune, wateya veşartî an zanîna veşartî tune. Tenê nexşeyek li ser pêkanîna pratîkî ya ramanek teorîkî. Ger kesek eleqedar be, bixwîne. Heke hûn ne eleqedar in, wextê xwe winda nekin.
Formulkirina pirsgirêkê
Bêyî ku bi kûrahî li qada mijarê vegere, bi kurtî, pirsgirêk dikare wiha were formulekirin: Tabloyek heye ku saziyek karsaziyek diyar dike. Rêzên di tabloyê de dikarin werin jêbirin, lê rêz bi fizîkî nayên jêbirin; divê bêne veşartin.
Ji ber ku tê gotin: "Tiştek jêbirin, tenê navê wî biguherînin. Înternet HER TIŞTÎ hildide"
Di rê de, tê pêşniyar kirin ku fonksiyonên hilanîn ên heyî yên ku bi vê saziyê re dixebitin ji nû ve nenivîsin.
Ji bo pêkanîna vê têgehê, tablo xwedî taybetmendiyek e is_deleted. Dûv re her tişt hêsan e - hûn hewce ne ku pê ewle bin ku xerîdar dikare tenê rêzikên ku tê de taybetmendiyê tê de bibînin is_deleted şaş Mekanîzma ji bo çi tê bikaranîn? Ewlekariya Asta Rêzê.
Реализация
Rol û nexşeyek cûda biafirînin
CREATE ROLE repos;
CREATE SCHEMA repos;
Tabloya armancê çêbikin
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Vekirin Ewlekariya Asta Rêzê
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 ;
Fonksiyona xizmetê - di tabloyê de rêzek jêbirin
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;
Fonksiyona karsaziyê - jêbirina belgeyekê
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Encam
Xerîdar belgeyê jê dike
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Piştî jêbirinê, xerîdar belgeyê nabîne
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Lê di databasê de belge nayê jêbirin, tenê taybetmendî tê guhertin is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Ya ku di daxuyaniya pirsgirêkê de hewce bû ev e.
Encam
Ger mijar balkêş e, di lêkolîna paşîn de hûn dikarin mînakek pêkanîna modelek-bingeha rolê ji bo veqetandina gihîştina daneyê bi karanîna Ewlekariya Asta Rêzê nîşan bidin.
Source: www.habr.com