Als Ergänzung zu
Den theoreteschen Deel ass gutt an der Dokumentatioun beschriwwen
Et gëtt näischt Neies am Artikel, et gëtt keng verstoppte Bedeitung oder geheimt Wëssen. Just eng Skizz iwwer d'praktesch Ëmsetzung vun enger theoretesch Iddi. Wann iergendeen interesséiert ass, liest et. Wann Dir net interesséiert sidd, verschwend net Är Zäit.
Problemerklärung
Ouni déif an d'Themaberäich ze tauchen, kuerz, kann de Problem wéi follegt formuléiert ginn: Et gëtt en Dësch deen eng bestëmmte Geschäftsunitéit implementéiert. Reihen an der Tabell kënne geläscht ginn, awer Reihen kënnen net kierperlech geläscht ginn; si musse verstoppt ginn.
Well et gëtt gesot: "Läscht näischt, einfach ëmbenennen. Den Internet späichert ALLES"
Ënnerwee ass et unzeroden net existent gespäichert Funktiounen ze iwwerschreiwe déi mat dëser Entitéit funktionnéieren.
Fir dëst Konzept ëmzesetzen, huet den Dësch den Attribut ass_geläscht. Dann ass alles einfach - Dir musst sécher sinn datt de Client nëmmen d'Linnen an deem d'Attribut gesinn ass_geläscht falsch Fir wat gëtt de Mechanismus benotzt? Rei Niveau Sécherheet.
Ëmsetzung
Schafen eng separat Roll a Schema
CREATE ROLE repos;
CREATE SCHEMA repos;
Schafen der Zil- Dësch
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Umaachen Rei Niveau Sécherheet
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 ;
Service Funktioun - eng Zeil an der Tabell läschen
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;
Business Funktioun - en Dokument läschen
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Resultater
De Client läscht d'Dokument
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Nom Läschen gesäit de Client d'Dokument net
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Awer an der Datebank gëtt d'Dokument net geläscht, nëmmen den Attribut gëtt geännert ass_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Wat ass wat an der Problemausso gefuerdert gouf.
D 'Resultat
Wann d'Thema interessant ass, kënnt Dir an der nächster Etude e Beispill weisen fir e Roll-baséiert Modell ëmzesetzen fir den Datezougang mat Row Level Security ze trennen.
Source: will.com