PostgreSQL рдорд╛ рдкрдЩреНрдХреНрддрд┐ рд╕реНрддрд░ рд╕реБрд░рдХреНрд╖рд╛ рд▓рд╛рдЧреВ рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдПрдХ рдЕрдзреНрдпрдпрди

рдХреЛ рдкреВрд░рдХрдХреЛ рд░реВрдкрдорд╛ PostgreSQL рднрдгреНрдбрд╛рд░рдг рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕реНрддрд░рдорд╛ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рдЕрдзреНрдпрдпрди ╨╕ рдореБрдЦреНрдп рд░реВрдкрдорд╛ рд╡рд┐рд╕реНрддреГрдд рдЬрд╡рд╛рдлрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛ рдЯрд┐рдкреНрдкрдгреА.

рд╕реИрджреНрдзрд╛рдиреНрддрд┐рдХ рднрд╛рдЧ рдХрд╛рдЧрдЬрд╛рддрдорд╛ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ PostgreSQL - рдкрдЩреНрдХреНрддрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐рд╣рд░реВред рддрд▓ рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╛рдкрд╛рд░ рдХрд╛рд░реНрдп - рдореЗрдЯрд╛рдЗрдПрдХреЛ рдбрд╛рдЯрд╛ рд▓реБрдХрд╛рдЙрдиреЗред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд╕рдорд░реНрдкрд┐рдд рд╕реНрдХреЗрдЪ RLS рдкреНрд░рдпреЛрдЧ рдЧрд░реА рд░реЛрд▓ рдореЛрдбрд▓рд┐рдЩ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддреБрддред

PostgreSQL рдорд╛ рдкрдЩреНрдХреНрддрд┐ рд╕реНрддрд░ рд╕реБрд░рдХреНрд╖рд╛ рд▓рд╛рдЧреВ рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдПрдХ рдЕрдзреНрдпрдпрди

рд▓реЗрдЦрдорд╛ рдХреБрдиреИ рдирдпрд╛рдБ рдХреБрд░рд╛ рдЫреИрди, рдХреБрдиреИ рд▓реБрдХреЗрдХреЛ рдЕрд░реНрде рд╡рд╛ рдЧреЛрдкреНрдп рдЬреНрдЮрд╛рди рдЫреИрдиред рд╕реИрджреНрдзрд╛рдиреНрддрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╛рд░реЗ рдорд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдХреЗрдЪред рдпрджрд┐ рдХрд╕реИрд▓рд╛рдИ рд░реБрдЪрд┐ рдЫ рднрдиреЗ, рдпреЛ рдкрдвреНрдиреБрд╣реЛрд╕реНред рдпрджрд┐ рддрдкрд╛рдЗрдБ рд░реВрдЪрд┐ рд╣реБрдиреБрд╣реБрдиреНрди рднрдиреЗ, рддрдкрд╛рдЗрдБрдХреЛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирдЧрд░реНрдиреБрд╣реЛрд╕реНред

рд╕рдорд╕реНрдпрд╛рдХреЛ рдЧрдарди

рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░рдорд╛ рдЧрд╣рд┐рд░реЛ рдбреБрдмреНрди рдмрд┐рдирд╛, рдЫреЛрдЯрдХрд░реАрдорд╛, рд╕рдорд╕реНрдпрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рддрдпрд╛рд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ: рддреНрдпрд╣рд╛рдБ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЫ рдЬреБрди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╛рдкрд╛рд░ рдЗрдХрд╛рдИ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫред рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдкрдЩреНрдХреНрддрд┐рд╣рд░реВ рдореЗрдЯрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ, рддрд░ рдкрдЩреНрдХреНрддрд┐рд╣рд░реВ рднреМрддрд┐рдХ рд░реВрдкрдорд╛ рдореЗрдЯрд╛рдЙрди рд╕рдХрд┐рдБрджреИрди; рддрд┐рдиреАрд╣рд░реВ рд▓реБрдХрд╛рдЙрдиреБ рдкрд░реНрдЫред

рдХрд┐рдирднрдиреЗ рдпреЛ рднрдирд┐рдПрдХреЛ рдЫ: "рдХреЗрд╣реА рдкрдирд┐ рдирдореЗрдЯреНрдиреБрд╣реЛрд╕реН, рдХреЗрд╡рд▓ рдпрд╕рдХреЛ рдирд╛рдо рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдЗрдиреНрдЯрд░рдиреЗрдЯрд▓реЗ рд╕рдмреИ рдереЛрдХ рднрдгреНрдбрд╛рд░ рдЧрд░реНрдЫ"

рдмрд╛рдЯреЛрдХреЛ рд╕рд╛рдердорд╛, рдпреЛ рдПрдХрд╛рдЗрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЕрд╡рд╕реНрдерд┐рдд рднрдгреНрдбрд╛рд░рдг рдХрд╛рд░реНрдпрд╣рд░реВ рдкреБрди: рд▓реЗрдЦреНрдиреБ рд╣реБрдБрджреИрдиред

рдпреЛ рдЕрд╡рдзрд╛рд░рдгрд╛ рд▓рд╛рдЧреВ рдЧрд░реНрди, рддрд╛рд▓рд┐рдХрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЫ рдореЗрдЯрд┐рдПрдХреЛ рдЫред рддреНрдпрд╕реЛрднрдП рд╕рдмреИ рдХреБрд░рд╛ рд╕рд░рд▓ рдЫ - рддрдкрд╛рдИрд▓реЗ рдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ рдЧреНрд░рд╛рд╣рдХрд▓реЗ рдХреЗрд╡рд▓ рд▓рд╛рдЗрдирд╣рд░реВ рджреЗрдЦреНрди рд╕рдХреНрдЫ рдЬрд╕рдорд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдЯрд┐рдПрдХреЛ рдЫ рдЧрд▓рдд рд╕рдВрдпрдиреНрддреНрд░ рдХреЗ рдХреЛ рд▓рд╛рдЧреА рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ? рдкрдЩреНрдХреНрддрд┐ рд╕реНрддрд░ рд╕реБрд░рдХреНрд╖рд╛ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЫреБрдЯреНрдЯреИ рднреВрдорд┐рдХрд╛ рд░ рдпреЛрдЬрдирд╛ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди