PostgreSQL āĻ āĻ¸āĻžāĻ°āĻŋ āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻ‰āĻĒāĻ° āĻāĻ•āĻŸāĻŋ āĻ—āĻŦā§‡āĻˇāĻŖāĻž

āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻĒā§‚āĻ°āĻ• āĻšāĻŋāĻ¸āĻžāĻŦā§‡ PostgreSQL āĻ¸āĻžā§āĻšāĻŋāĻ¤ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¸ā§āĻ¤āĻ°ā§‡ āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧāĻŋāĻ• āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻ‰āĻĒāĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻ§ā§āĻ¯āĻ¯āĻŧāĻ¨ и āĻĒā§āĻ°āĻ§āĻžāĻ¨āĻ¤ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻ‰āĻ¤ā§āĻ¤āĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ° āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯.

āĻ¤āĻžāĻ¤ā§āĻ¤ā§āĻŦāĻŋāĻ• āĻ…āĻ‚āĻļāĻŸāĻŋ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨ā§‡ āĻ­āĻžāĻ˛āĻ­āĻžāĻŦā§‡ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ - āĻ¸āĻžāĻ°āĻŋ āĻ¸ā§āĻ°āĻ•ā§āĻˇāĻž āĻ¨ā§€āĻ¤āĻŋ. āĻ¨ā§€āĻšā§‡ āĻāĻ•āĻŸāĻŋ āĻ›ā§‹āĻŸ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧāĻŋāĻ• āĻ•āĻžāĻœ - āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻĄā§‡āĻŸāĻž āĻ˛ā§āĻ•āĻžāĻ¨ā§‹āĨ¤ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻŦā§‡āĻĻāĻŋāĻ¤ āĻ¸ā§āĻ•ā§‡āĻš RLS āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ°ā§‹āĻ˛ āĻŽāĻĄā§‡āĻ˛āĻŋāĻ‚ āĻ†āĻ˛āĻžāĻĻāĻžāĻ­āĻžāĻŦā§‡ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

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

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨