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

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

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

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

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

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд┐рд░реВрдкрдг

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

рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ: "рдХреБрдЫ рднреА рдордд рд╣рдЯрд╛рдУ, рдмрд╕ рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓реЛред" рдЗрдВрдЯрд░рдиреЗрдЯ рд╕рдм рдХреБрдЫ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ"

рд╕рд╛рде рд╣реА, рдпрд╣ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЗрд╕ рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореМрдЬреВрджрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЛрдмрд╛рд░рд╛ рди рд▓рд┐рдЦреЗрдВред

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

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

рдПрдХ рдЕрд▓рдЧ рднреВрдорд┐рдХрд╛ рдФрд░ рд╕реНрдХреАрдорд╛ рдмрдирд╛рдПрдВ

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ