Sgrùdadh air buileachadh Tèarainteachd Ìre Row ann am PostgreSQL

Mar thaic ri Sgrùdadh air loidsig gnìomhachais a chuir an gnìomh aig ìre gnìomhan stòr PostgreSQL и gu sònraichte airson freagairt mhionaideach air aithris.

Tha am pàirt teòiridheach air a mhìneachadh gu math anns na sgrìobhainnean PostgreSQL - Poileasaidhean dìon sreath. Gu h-ìosal tha buileachadh practaigeach de bheag gnìomh gnìomhachais sònraichte - a’ falach dàta a chaidh a dhubhadh às. Sgeidse coisrigte airson buileachadh Modail dreuchd a’ cleachdadh RLS air a thaisbeanadh fa leth.

Sgrùdadh air buileachadh Tèarainteachd Ìre Row ann am PostgreSQL

Chan eil dad ùr san artaigil, chan eil brìgh falaichte no eòlas dìomhair ann. Dìreach sgeidse mu bhuileachadh practaigeach beachd teòiridheach. Ma tha ùidh aig duine sam bith, leugh e. Mura h-eil ùidh agad, na caill an ùine agad.

Aithris dhuilgheadas

Gun a bhith a 'dàibheadh ​​​​gu domhainn a-steach don raon cuspair, goirid, faodar an duilgheadas a dhealbhadh mar a leanas: Tha clàr ann a bhios a’ buileachadh eintiteas gnìomhachais sònraichte. Faodar sreathan sa chlàr a dhubhadh às, ach chan urrainnear sreathan a dhubhadh às gu corporra; feumaidh iad a bhith falaichte.

Oir thathar ag ràdh: “Na sguab às dad, dìreach ainmich e. Bidh an eadar-lìn a’ stòradh a h-uile càil"

Air an t-slighe, tha e ciallach gun a bhith ag ath-sgrìobhadh gnìomhan gnàthaichte a tha ag obair leis an eintiteas seo.

Gus am bun-bheachd seo a bhuileachadh, tha am feart aig a’ chlàr tha_ air a sguabadh às. An uairsin tha a h-uile dad sìmplidh - feumaidh tu dèanamh cinnteach nach fhaic an neach-dèiligidh ach na loidhnichean anns a bheil am feart tha_ air a sguabadh às breugach Dè an uidheam a thathar a' cleachdadh airson? Tèarainteachd ìre sreath.

Реализация

Cruthaich àite agus sgeama air leth

CREATE ROLE repos;
CREATE SCHEMA repos;

Cruthaich an clàr targaid

CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos

Tionndaidh air Tèarainteachd Ìre Row

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 ;

Gnìomh seirbheis - cuir às do shreath sa chlàr

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;

Gnìomh gnìomhachais - a sguabadh às sgrìobhainn

CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM  repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

Toraidhean

Bidh an neach-dèiligidh a’ cuir às don sgrìobhainn

SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );

Às deidh a dhubhadh às, chan fhaic an neach-dèiligidh an sgrìobhainn

SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)

Ach anns an stòr-dàta chan eil an sgrìobhainn air a dhubhadh às, chan eil ach am feart air atharrachadh tha_del

psql -d my_db
SELECT  id, name , is_del FROM repos.file ;
id |  name  | is_del
--+---------+------------
 1 |  test_1 | t
(1 row)

Sin na bha a dhìth anns an aithris duilgheadas.

An toradh

Ma tha an cuspair inntinneach, anns an ath sgrùdadh faodaidh tu eisimpleir de bhith a’ cur an gnìomh modal stèidhichte air dreuchd airson a bhith a’ sgaradh ruigsinneachd dàta a’ cleachdadh Row Level Security.

Source: www.habr.com

Cuir beachd ann