Som ett komplement till och frÀmst för en utförlig respons till .
Den teoretiska delen Ă€r utmĂ€rkt beskriven i dokumentationen â . Nedan diskuteras en praktisk implementering av en liten specifik affĂ€rsuppgift â att dölja borttagna data. Studien Ă€gnas Ă„t implementeringen av som presenteras separat.

Artikeln innehĂ„ller ingenting nytt, inga dolda betydelser eller hemliga insikter. Det Ă€r bara en skiss av praktisk tillĂ€mpning av en teoretisk idĂ©. Om nĂ„gon Ă€r intresserad â lĂ€s. Om inte â slösa inte din tid.
UppgiftsstÀllande
Utan att fördjupa oss alltför mycket i ÀmnesomrÄdet kan vi kort formulera uppgiften pÄ följande sÀtt: det finns en tabell som representerar en affÀrsenhet. Rader i tabellen kan tas bort, men rader fÄr inte tas bort fysiskt, de mÄste döljas.
Ty det Ă€r sagt â "Ta aldrig bort nĂ„gonting, bara döp om det. Internet kommer att spara ALLT"
Det Àr dessutom önskvÀrt att inte skriva om redan existerande lagrade funktioner som arbetar med denna enhet.
För att genomföra detta koncept har tabellen en attribut is_deleted. Vidare Ă€r allt enkelt â vi mĂ„ste se till att klienten endast kan se rader dĂ€r attributet is_deleted Ă€r falskt. För detta anvĂ€nds mekanismen Row Level Security.
Implementering
Vi skapar en sÀrskild roll och schema
CREATE ROLE repos;
CREATE SCHEMA repos;Vi skapar den mÄltavlan
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA reposVi aktiverar Row Level Security
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;TjĂ€nstefunktion â ta bort en rad i tabellen
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;AffĂ€rsfunktion â ta bort dokumentet
CREATE OR REPLACE business_functions.deleteDoc(doc_for_delete JSON)
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete(doc_id);
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;Resultat
Klienten tar bort dokumentet
SELECT business_functions.delCFile((SELECT json_build_object('CId', 3)));Efter borttagningen ser klienten av dokumentet inte
SELECT business_functions.getCFile((SELECT json_build_object('CId', 3)));
-----------------
(0 rader)Men i databasen har dokumentet inte tagits bort, endast attributet har Àndrats is_del
psql -d my_db
SELECT id, name, is_del FROM repos.file;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 rad)Vilket var vad som krÀvdes i uppgiften.
Resultat
Om Àmnet Àr intressant kan vi i nÀsta studie visa ett exempel pÄ implementering av en rollmodell för delad datatillgÄng med anvÀndning av Row Level Security.
KĂ€lla: habr.com
