рдХреЗ рдкреВрд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднрд╛рдЧ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рд▓реЗрдЦ рдореЗрдВ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреЛрдИ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдЕрд░реНрде рдпрд╛ рдЧреБрдкреНрдд рдЬреНрдЮрд╛рди рдирд╣реАрдВ рд╣реИред рдПрдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╕ рдПрдХ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░ред рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рд░реБрдЪрд┐ рд╣реЛ рддреЛ рдЗрд╕реЗ рдкрдврд╝реЗрдВред рдпрджрд┐ рдЖрдкрдХреА рд░реБрдЪрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрдкрдирд╛ рд╕рдордп рдмрд░реНрдмрд╛рдж рди рдХрд░реЗрдВред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд┐рд░реВрдкрдг
рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЙрддрд░реЗ рдмрд┐рдирд╛, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЗрдХрд╛рдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛; рдЙрдиреНрд╣реЗрдВ рдЫрд┐рдкрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ: "рдХреБрдЫ рднреА рдордд рд╣рдЯрд╛рдУ, рдмрд╕ рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓реЛред" рдЗрдВрдЯрд░рдиреЗрдЯ рд╕рдм рдХреБрдЫ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ"
рд╕рд╛рде рд╣реА, рдпрд╣ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЗрд╕ рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореМрдЬреВрджрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЛрдмрд╛рд░рд╛ рди рд▓рд┐рдЦреЗрдВред
рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдлрд┐рд░ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдХреЗрд╡рд▓ рд╡рд╣реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рджреЗрдЦ рд╕рдХреЗ рдЬрд┐рдирдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЕрд╕рддреНрдп рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдкрдВрдХреНрддрд┐ рд╕реНрддрд░реАрдп рд╕реБрд░рдХреНрд╖рд╛.
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдПрдХ рдЕрд▓рдЧ рднреВрдорд┐рдХрд╛ рдФрд░ рд╕реНрдХреАрдорд╛ рдмрдирд╛рдПрдВ
CREATE ROLE repos;
CREATE SCHEMA repos;
рд▓рдХреНрд╖реНрдп рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдБ
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
рдЪрд╛рд▓реВ рдХрд░реЛ рдкрдВрдХреНрддрд┐ рд╕реНрддрд░ рд╕реБрд░рдХреНрд╖рд╛
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 ;
рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдп - рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛рдирд╛
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;
рд╡реНрдпрд╡рд╕рд╛рдпрд┐рдХ рдЖрдпреЛрдЬрди тАФ рдХрд┐рд╕реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╣рдЯрд╛рдирд╛
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
рдирд┐рд╖реНрдХрд░реНрд╖
рдХреНрд▓рд╛рдЗрдВрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрд▓рд╛рдЗрдВрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрджрд▓ рджреА рдЬрд╛рддреА рд╣реИ is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
рдЬреЛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрдерди рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рд╕рдВрдкреВрд░реНрдг
рдпрджрд┐ рд╡рд┐рд╖рдп рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдЕрдЧрд▓реЗ рдЕрдзреНрдпрдпрди рдореЗрдВ рдЖрдк рд░реЛ рд▓реЗрд╡рд▓ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрдорд┐рдХрд╛-рдЖрдзрд╛рд░рд┐рдд рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрд░реЛрдд: www.habr.com