Osagarri gisa
Atal teorikoa ondo deskribatuta dago dokumentazioan
Artikuluan ez dago ezer berririk, ez dago ezkutuko esanahirik edo ezkutuko ezagutzarik. Ideia teoriko baten ezarpen praktikoari buruzko zirriborro bat besterik ez. Norbaiti interesatzen bazaio, irakurri. Interesatzen ez bazaizu, ez galdu denbora.
Arazoaren formulazioa
Gai-eremuan sakondu gabe, laburki, arazoa honela formula daiteke: Enpresa-entitate jakin bat ezartzen duen mahai bat dago. Taularen errenkadak ezabatu egin daitezke, baina errenkadak ezin dira fisikoki ezabatu; ezkutatu egin behar dira.
Zeren esaten da: βEz ezabatu ezer, izena aldatu besterik ez. Internetek DENA gordetzen du"
Bide horretan, entitate honekin lan egiten duten gordetako funtzioak ez berridaztea komeni da.
Kontzeptu hau ezartzeko, taulak du atributua ezabatuta dago. Orduan dena erraza da: ziurtatu behar duzu bezeroak atributuak dituen lerroak soilik ikus ditzakeela. ezabatuta dago faltsua Zertarako erabiltzen da mekanismoa? Errenkada-mailako segurtasuna.
Inplementazioa
Sortu aparteko rol eta eskema
CREATE ROLE repos;
CREATE SCHEMA repos;
Sortu xede-taula
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Barne hartzen ditugu Ilara Maila Segurtasuna
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 ;
Zerbitzu-funtzioa β taulako errenkada bat ezabatzea
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;
Enpresa-funtzioa β Dokumentu bat ezabatzea
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Findings
Bezeroak dokumentua ezabatzen du
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Ezabatu ondoren, bezeroak ez du dokumentua ikusten
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Baina datu-basean dokumentua ez da ezabatzen, atributua bakarrik aldatzen da is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Arazoaren adierazpenean eskatzen zena.
Guztira
Gaia interesgarria bada, hurrengo azterketan Row Level Security erabiliz datuen sarbidea bereizteko roletan oinarritutako eredu bat ezartzeko adibide bat erakutsi dezakezu.
Iturria: www.habr.com