Fel ategu at
Disgrifir y rhan ddamcaniaethol yn dda yn y ddogfennaeth
Nid oes dim byd newydd yn yr erthygl, nid oes unrhyw ystyr cudd na gwybodaeth gyfrinachol. Braslun yn unig am weithrediad ymarferol syniad damcaniaethol. Os oes gan unrhyw un ddiddordeb, darllenwch ef. Os nad oes gennych ddiddordeb, peidiwch â gwastraffu'ch amser.
Datganiad o'r broblem
Heb blymio'n ddwfn i'r maes pwnc, yn fyr, gellir llunio'r broblem fel a ganlyn: Mae tabl sy'n gweithredu endid busnes penodol. Gellir dileu rhesi yn y tabl, ond ni ellir dileu rhesi yn gorfforol; rhaid eu cuddio.
Oherwydd dywedir: “Peidiwch â dileu unrhyw beth, dim ond ei ailenwi. Mae'r Rhyngrwyd yn storio POPETH"
Ar hyd y ffordd, fe'ch cynghorir i beidio ag ailysgrifennu swyddogaethau storio presennol sy'n gweithio gyda'r endid hwn.
Er mwyn gweithredu'r cysyniad hwn, mae gan y tabl y priodoledd yn_dileu. Yna mae popeth yn syml - mae angen i chi sicrhau bod y cleient yn gallu gweld dim ond y llinellau y mae'r priodoledd yn_dileu ffug Ar gyfer beth mae'r mecanwaith a ddefnyddir? Diogelwch Lefel Rhes.
Gweithredu
Creu rôl a sgema ar wahân
CREATE ROLE repos;
CREATE SCHEMA repos;
Creu'r tabl targed
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Rydym yn cynnwys Diogelwch Lefel 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 ;
Swyddogaeth gwasanaeth — dileu rhes yn y tabl
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;
Swyddogaeth busnes — dileu dogfen
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Canfyddiadau
Mae'r cleient yn dileu'r ddogfen
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Ar ôl dileu, nid yw'r cleient yn gweld y ddogfen
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Ond yn y gronfa ddata nid yw'r ddogfen yn cael ei dileu, dim ond y priodoledd sy'n cael ei newid yn_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Dyna oedd ei angen yn y datganiad problem.
Cyfanswm
Os yw'r pwnc yn ddiddorol, yn yr astudiaeth nesaf gallwch ddangos enghraifft o weithredu model rôl ar gyfer gwahanu mynediad data gan ddefnyddio Row Level Security.
Ffynhonnell: hab.com