Lêkolînek li ser pêkanîna Ewlekariya Asta Rêzê li PostgreSQL

Wek temamkerê Lêkolînek li ser bicîhkirina mantiqa karsaziyê di asta fonksiyonên hilanîn ên PostgreSQL de и bi giranî ji bo bersivek berfireh li ser şîrove.

Di belgeyê de beşa teorîk baş tê vegotin PostgreSQL - Polîtîkayên parastina rêzê. Li jêr pêkanîna pratîk a piçûk e Karê karsaziya taybetî - veşartina daneyên jêbirin. Sketch ji bo pêkanîna Modela rola bi karanîna RLS cuda pêşkêş kirin.

Lêkolînek li ser pêkanîna Ewlekariya Asta Rêzê li PostgreSQL

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

Add a comment