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_рдбреЗрд▓

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