рдХреЛ рдкреВрд░рдХрдХреЛ рд░реВрдкрдорд╛
рд╕реИрджреНрдзрд╛рдиреНрддрд┐рдХ рднрд╛рдЧ рдХрд╛рдЧрдЬрд╛рддрдорд╛ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ
рд▓реЗрдЦрдорд╛ рдХреБрдиреИ рдирдпрд╛рдБ рдХреБрд░рд╛ рдЫреИрди, рдХреБрдиреИ рд▓реБрдХреЗрдХреЛ рдЕрд░реНрде рд╡рд╛ рдЧреЛрдкреНрдп рдЬреНрдЮрд╛рди рдЫреИрдиред рд╕реИрджреНрдзрд╛рдиреНрддрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╛рд░реЗ рдорд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдХреЗрдЪред рдпрджрд┐ рдХрд╕реИрд▓рд╛рдИ рд░реБрдЪрд┐ рдЫ рднрдиреЗ, рдпреЛ рдкрдвреНрдиреБрд╣реЛрд╕реНред рдпрджрд┐ рддрдкрд╛рдЗрдБ рд░реВрдЪрд┐ рд╣реБрдиреБрд╣реБрдиреНрди рднрдиреЗ, рддрдкрд╛рдЗрдБрдХреЛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирдЧрд░реНрдиреБрд╣реЛрд╕реНред
рд╕рдорд╕реНрдпрд╛рдХреЛ рдЧрдарди
рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░рдорд╛ рдЧрд╣рд┐рд░реЛ рдбреБрдмреНрди рдмрд┐рдирд╛, рдЫреЛрдЯрдХрд░реАрдорд╛, рд╕рдорд╕реНрдпрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рддрдпрд╛рд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ: рддреНрдпрд╣рд╛рдБ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЫ рдЬреБрди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╛рдкрд╛рд░ рдЗрдХрд╛рдИ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫред рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдкрдЩреНрдХреНрддрд┐рд╣рд░реВ рдореЗрдЯрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ, рддрд░ рдкрдЩреНрдХреНрддрд┐рд╣рд░реВ рднреМрддрд┐рдХ рд░реВрдкрдорд╛ рдореЗрдЯрд╛рдЙрди рд╕рдХрд┐рдБрджреИрди; рддрд┐рдиреАрд╣рд░реВ рд▓реБрдХрд╛рдЙрдиреБ рдкрд░реНрдЫред
рдХрд┐рдирднрдиреЗ рдпреЛ рднрдирд┐рдПрдХреЛ рдЫ: "рдХреЗрд╣реА рдкрдирд┐ рдирдореЗрдЯреНрдиреБрд╣реЛрд╕реН, рдХреЗрд╡рд▓ рдпрд╕рдХреЛ рдирд╛рдо рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдЗрдиреНрдЯрд░рдиреЗрдЯрд▓реЗ рд╕рдмреИ рдереЛрдХ рднрдгреНрдбрд╛рд░ рдЧрд░реНрдЫ"
рдмрд╛рдЯреЛрдХреЛ рд╕рд╛рдердорд╛, рдпреЛ рдПрдХрд╛рдЗрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЕрд╡рд╕реНрдерд┐рдд рднрдгреНрдбрд╛рд░рдг рдХрд╛рд░реНрдпрд╣рд░реВ рдкреБрди: рд▓реЗрдЦреНрдиреБ рд╣реБрдБрджреИрдиред
рдпреЛ рдЕрд╡рдзрд╛рд░рдгрд╛ рд▓рд╛рдЧреВ рдЧрд░реНрди, рддрд╛рд▓рд┐рдХрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЫ рдореЗрдЯрд┐рдПрдХреЛ рдЫред рддреНрдпрд╕реЛрднрдП рд╕рдмреИ рдХреБрд░рд╛ рд╕рд░рд▓ рдЫ - рддрдкрд╛рдИрд▓реЗ рдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ рдЧреНрд░рд╛рд╣рдХрд▓реЗ рдХреЗрд╡рд▓ рд▓рд╛рдЗрдирд╣рд░реВ рджреЗрдЦреНрди рд╕рдХреНрдЫ рдЬрд╕рдорд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдЯрд┐рдПрдХреЛ рдЫ рдЧрд▓рдд рд╕рдВрдпрдиреНрддреНрд░ рдХреЗ рдХреЛ рд▓рд╛рдЧреА рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ? рдкрдЩреНрдХреНрддрд┐ рд╕реНрддрд░ рд╕реБрд░рдХреНрд╖рд╛ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЫреБрдЯреНрдЯреИ рднреВрдорд┐рдХрд╛ рд░ рдпреЛрдЬрдирд╛ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН
CREATE ROLE repos;
CREATE SCHEMA repos;
рд▓рдХреНрд╖реНрдп рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
рд╣рд╛рдореА рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫреМрдВ рдкowреНрдХреНрддрд┐ рд╕реНрддрд░ рд╕реБрд░рдХреНрд╖рд╛
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