Kòm yon konpleman nan
Pati teyorik la byen dekri nan dokiman an
Pa gen anyen nouvo nan atik la, pa gen okenn siyifikasyon kache oswa konesans sekrè. Jis yon chema sou aplikasyon an pratik nan yon lide teyorik. Si yon moun enterese, li li. Si ou pa enterese, pa pèdi tan ou.
Deklarasyon sou pwoblèm nan
San yo pa plonje pwofondman nan sijè a, yon ti tan, pwoblèm nan ka formul jan sa a: Gen yon tab ki aplike yon sèten antite biznis. Ranje nan tablo a ka efase, men ranje yo pa ka efase fizikman; yo dwe kache.
Paske yo di: "Pa efase anyen, jis chanje non li. Entènèt la sere tout bagay"
Sou wout la, li rekòmande pou pa reekri fonksyon ki deja estoke ki travay ak antite sa a.
Pou aplike konsèp sa a, tab la gen atribi a se_deleted. Lè sa a, tout bagay se senp - ou bezwen asire w ke kliyan an ka wè sèlman liy yo nan ki atribi a. se_deleted fo Pou kisa mekanis yo itilize? Ranje Nivo Sekirite.
Aplikasyon
Kreye yon wòl separe ak chema
CREATE ROLE repos;
CREATE SCHEMA repos;
Kreye tab sib la
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Nou genyen ladan yo Ranje Nivo Sekirite Sosyal
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 ;
Fonksyon sèvis — efase yon ranje nan tablo a
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;
Fonksyon biznis - efase yon dokiman
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Jwenn
Kliyan an efase dokiman an
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Apre efase, kliyan an pa wè dokiman an
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Men, nan baz done a dokiman an pa efase, se sèlman atribi a chanje is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Ki sa ki te egzije nan deklarasyon pwoblèm lan.
Total
Si sijè a enteresan, nan pwochen etid la ou ka montre yon egzanp sou aplikasyon yon modèl ki baze sou wòl pou separe aksè done lè l sèvi avèk Row Level Security.
Sous: www.habr.com