PostgreSQL-āĻ āĻ°ā§‹ āĻ˛ā§‡āĻ­ā§‡āĻ˛ āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž-āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ• āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻŽāĻĄā§‡āĻ˛ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž

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

āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻ•ā§ŒāĻļāĻ˛āĻŸāĻŋ "āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧāĻŋāĻ• āĻ¯ā§āĻ•ā§āĻ¤āĻŋ" āĻ§āĻžāĻ°āĻŖāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻœāĻĄāĻŧāĻŋāĻ¤, āĻ¯āĻž āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻ°āĻ“ āĻŦāĻŋāĻļāĻĻā§‡ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ - PostgreSQL āĻ¸āĻžā§āĻšāĻŋāĻ¤ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¸ā§āĻ¤āĻ°ā§‡ āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧāĻŋāĻ• āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻ‰āĻĒāĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻ§ā§āĻ¯āĻ¯āĻŧāĻ¨

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

PostgreSQL-āĻ āĻ°ā§‹ āĻ˛ā§‡āĻ­ā§‡āĻ˛ āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž-āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ• āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻŽāĻĄā§‡āĻ˛ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž

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

āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ—āĻ āĻ¨

āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻĨāĻŋ āĻĻā§‡āĻ–āĻž/āĻĸā§‹āĻ•āĻžāĻ¨ā§‹/āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨/āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§ āĻ•āĻ°āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻāĻ¨ā§āĻŸā§āĻ°āĻŋ āĻŦā§‹āĻāĻžāĻ¯āĻŧ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŦāĻšā§-āĻĨā§‡āĻ•ā§‡-āĻ…āĻ¨ā§‡āĻ• āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§āĻ•ā§āĻ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€. āĻ¤ā§āĻšā§āĻ›āĻ¤āĻžāĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻŦāĻŋāĻŦāĻ°āĻŖ āĻŦāĻžāĻĻ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻāĻ˛āĻžāĻ•āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāĻ¤ āĻ¸ā§āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻŦāĻŋāĻŦāĻ°āĻŖāĻ“ āĻŦāĻžāĻĻ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

āĻ­ā§‚āĻŽāĻŋāĻ•āĻž, āĻ¸ā§āĻ•āĻŋāĻŽāĻž, āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨

āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž

CREATE ROLE store;
CREATE SCHEMA store AUTHORIZATION store;
CREATE TABLE store.docs
(
  id integer ,         --id Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ°
  man_id integer , --id ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€Đ° Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ°
  stat_id integer ,  --id ŅŅ‚Đ°Ņ‚ŅƒŅĐ° Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ°
  ...
  is_del BOOLEAN DEFAULT FALSE 
);
ALTER TABLE store.docs ADD CONSTRAINT doc_pk PRIMARY KEY (id);
ALTER TABLE store.docs OWNER TO store ;

RLS āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž

SELECT āĻ¸āĻžāĻ°āĻŋ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻšā§‡āĻ•_āĻ¸āĻŋāĻ˛ā§‡āĻ•ā§āĻŸ āĻ•āĻ°ā§āĻ¨

CREATE OR REPLACE FUNCTION store.check_select ( current_id store.docs.id%TYPE ) RETURNS boolean AS $$
DECLARE
  result boolean ;
  curr_pid integer ;
  curr_stat_id integer ;
  doc_man_id integer ;
BEGIN 
  -- DBA иĐŧĐĩĐĩŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋ ĐēĐž вŅĐĩĐŧ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ°Đŧ
  IF SESSION_USER = 'curr_dba'
  THEN
    RETURN TRUE ;
  END IF ;
  --------------------------------

  --ЕŅĐģи Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚ иĐŧĐĩĐĩŅ‚ ĐŧĐĩŅ‚ĐēŅƒ 'ŅƒĐ´Đ°ĐģĐĩĐŊ' - ĐŊĐĩ ĐŋĐžĐēаСŅ‹Đ˛Đ°Ņ‚ŅŒ в вŅ‹ĐąĐžŅ€ĐēĐĩ
  SELECT
    is_del
  INTO
    result
  FROM
    store.docs
  WHERE
    id = current_id ;
 IF result = TRUE
 THEN
   RETURN FALSE ;
 END IF ;
 --------------------------------

 --ПоĐģŅƒŅ‡Đ¸Ņ‚ŅŒ id Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ
 SELECT
   service_function.get_curr_pid ()
 INTO
   curr_pid ;
 --------------------------------

 --ПоĐģŅƒŅ‡Đ¸Ņ‚ŅŒ id ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€Đ° Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ°
 SELECT
   man_id
 INTO
   doc_man_id
 FROM
   store.docs
 WHERE
   id = current_id ;
 --------------------------------

 --ЕŅĐģи ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ° ĐŊĐĩ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅŒ иĐģи ĐŧĐĩĐŊĐĩĐ´ĐļĐĩŅ€ ĐŊĐĩ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊ
 --дОйавиŅ‚ŅŒ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚ в вŅ‹ĐąĐžŅ€ĐēŅƒ
 IF doc_man_id != curr_pid OR doc_man_id IS NULL
 THEN
   RETURN TRUE  ;
 ELSE
   --ПоĐģŅƒŅ‡Đ¸Ņ‚ŅŒ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš ŅŅ‚Đ°Ņ‚ŅƒŅ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ°
   SELECT
     stat_id                                         
   INTO
     curr_statid
   FROM
     store.docs
   WHERE
     id = current_id ;
    
   --ЕŅĐģи ŅŅ‚Đ°Ņ‚ŅƒŅ ĐŋОСвОĐģŅĐĩŅ‚ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚ - дОйавиŅ‚ŅŒ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚ в вŅ‹ĐąĐžŅ€ĐēŅƒ                     
   IF curr_statid = 4 OR curr_statid = 9
   THEN
     RETURN TRUE ;
   ELSE
   --ИĐŊĐ°Ņ‡Đĩ - иŅĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚ иС вŅ‹ĐąĐžŅ€Đēи
     RETURN FALSE ;
    END IF ;
  END IF ;
  --------------------------------

 RETURN FALSE ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
ALTER FUNCTION store.check_select( store.docs.id%TYPE  ) OWNER TO store ;
REVOKE EXECUTE ON FUNCTION store.check_select( store.docs.id%TYPE  ) FROM public; 
GRANT EXECUTE ON FUNCTION store.check_select( store.docs.id%TYPE  ) TO service_functions; 

āĻ¸āĻžāĻ°āĻŋ āĻĸā§‹āĻ•āĻžāĻ¨ā§‹āĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

check_insert

CREATE OR REPLACE FUNCTION store.check_insert ( current_id store.docs.id%TYPE ) RETURNS boolean AS $$
DECLARE
  curr_role_id integer ;
BEGIN
  --DBA ĐŧĐžĐļĐĩŅ‚ дОйавĐģŅŅ‚ŅŒ ŅŅ‚Ņ€ĐžĐēŅƒ в ĐģŅŽĐąĐžĐŧ ŅĐģŅƒŅ‡Đ°Đĩ
  IF SESSION_USER = 'curr_dba'
  THEN
    RETURN TRUE ;
  END IF ;
  --------------------------------

 --ПоĐģŅƒŅ‡Đ¸Ņ‚ŅŒ id Ņ€ĐžĐģи Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ 
 SELECT
   service_functions.current_rid()
  INTO
    curr_role_id ;
 --------------------------------

--ЕŅĐģи Ņ€ĐžĐģŅŒ Đ´ĐžĐŋŅƒŅĐēĐ°ĐĩŅ‚ вОСĐŧĐžĐļĐŊĐžŅŅ‚ŅŒ ŅĐžĐˇĐ´Đ°ĐŊиŅ ĐŊОвОĐŗĐž Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ°
--Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ
IF curr_role_id = 3 OR curr_role_id = 5     
THEN
  RETURN TRUE ;
END IF ;
--------------------------------
RETURN FALSE  ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
ALTER FUNCTION store.check_insert( store.docs.id%TYPE  ) OWNER TO store ;
REVOKE EXECUTE ON FUNCTION store.check_insert( store.docs.id%TYPE  ) FROM public;
GRANT EXECUTE ON FUNCTION store.check_insert( store.docs.id%TYPE  ) TO service_functions; 

āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ°āĻŋ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

check_delete

CREATE OR REPLACE FUNCTION store.check_delete ( current_id store.docs.id%TYPE )
RETURNS boolean AS $$
BEGIN  
  --ĐĸĐžĐģŅŒĐēĐž DBA ĐŧĐžĐļĐĩŅ‚ ŅƒĐ´Đ°ĐģŅŅ‚ŅŒ ŅŅ‚Ņ€ĐžĐēŅƒ 
  IF SESSION_USER = 'curr_dba'
  THEN
    RETURN TRUE ;
  END IF ;
  --------------------------------

  RETURN FALSE ;
END
$$ LANGUAGE plpgsql
SECURITY DEFINER;
ALTER FUNCTION store.check_delete( store.docs.id%TYPE  ) OWNER TO store ;
REVOKE EXECUTE ON FUNCTION store.check_delete( store.docs.id%TYPE  ) FROM public;

āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ°āĻŋ āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡āĨ¤

update_using

CREATE OR REPLACE FUNCTION store.update_using ( current_id store.docs.id%TYPE , is_del boolean  )
RETURNS boolean AS $$
BEGIN  
   --ДоĐēŅƒĐŧĐĩĐŊŅ‚Ņ‹ иĐŧĐĩŅŽŅ‰Đ¸Đĩ ŅŅ‚Đ°Ņ‚ŅƒŅ 'ŅƒĐ´Đ°ĐģĐĩĐŊ' - ĐŊĐĩ Ņ€ĐĩĐ´Đ°ĐēŅ‚иŅ€ŅƒŅŽŅ‚ŅŅ
   IF is_del 
   THEN
     RETURN FALSE ;
 ELSE
    RETURN TRUE ;
  END IF ;

END
$$ LANGUAGE plpgsql SECURITY DEFINER;
ALTER FUNCTION store.update_using(  store.docs.id%TYPE ,  boolean  ) OWNER TO store ;
REVOKE EXECUTE ON FUNCTION store.update_using(  store.docs.id%TYPE ,  boolean  ) FROM public;
GRANT EXECUTE ON FUNCTION store.update_using( store.docs.id%TYPE  ) TO service_functions;

āĻ†āĻĒāĻĄā§‡āĻŸ āĻšā§‡āĻ•

CREATE OR REPLACE FUNCTION store.update_with_check ( current_id store.docs.id%TYPE , is_del boolean )
RETURNS boolean AS $$
DECLARE
  current_rid integer ;
  current_statid integer ;
BEGIN                

  --DBA ĐŧĐžĐļĐĩŅ‚ ĐŋŅ€ĐžŅĐŧĐ°Ņ‚Ņ€Đ¸Đ˛Đ°Ņ‚ŅŒ ŅŅ‚Ņ€ĐžĐēŅƒ 
  IF SESSION_USER = 'curr_dba'
  THEN
    RETURN TRUE ;
  END IF ;
  --------------------------------

 --ПоĐģŅƒŅ‡Đ¸Ņ‚ŅŒ id Ņ€ĐžĐģи Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ 
 SELECT
   service_functions.current_rid()
  INTO
    curr_role_id ;
 --------------------------------                            

 --ĐŖĐ´Đ°ĐģĐĩĐŊиĐĩ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ° - иСĐŧĐĩĐŊĐĩĐŊиĐĩ ĐŋŅ€Đ¸ĐˇĐŊĐ°ĐēĐ° 
 IF is_deleted
 THEN
   --ЕŅĐģи Ņ€ĐžĐģŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ***
   IF current_role_id = 3        
   THEN
      SELECT
        stat_id                                          
      INTO
        curr_statid
      FROM
        store.docs
      WHERE
        id = current_id ;

      --ДоĐēŅƒĐŧĐĩĐŊŅ‚ в ŅŅ‚Đ°Ņ‚ŅƒŅĐĩ *** ĐŊĐĩĐģŅŒĐˇŅ ŅƒĐ´Đ°ĐģиŅ‚ŅŒ 
      IF current_status_id = 11
      THEN
         RETURN FALSE ;
      ELSE
      --МоĐļĐŊĐž ŅƒĐ´Đ°ĐģиŅ‚ŅŒ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚ в Đ´Ņ€ŅƒĐŗиŅ… ŅŅ‚Đ°Ņ‚ŅƒŅĐ°Ņ…
        RETURN TRUE ;
      END IF ;

    --ИĐŊĐ°Ņ‡Đĩ , ĐĩŅĐģи Ņ€ĐžĐģŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ***
    ELSIF current_role_id = 5            
    THEN
      --ВŅĐĩ ŅŅ‚Đ°Ņ‚ŅƒŅŅ‹ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ° 
      RETURN TRUE ;
    ELSE
      --ДŅ€ŅƒĐŗиĐĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ ŅƒĐ´Đ°ĐģŅŅ‚ŅŒ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Ņ‹
      RETURN FALSE ;
    END IF ;
 ELSE      
   --ОбĐŊОвĐģĐĩĐŊиĐĩ Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ° Ņ€Đ°ĐˇŅ€ĐĩŅˆĐĩĐŊĐž
    RETURN TRUE ;
END IF ;

RETURN FALSE ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
ALTER FUNCTION store.update_with_check( storg.docs.id%TYPE ,  boolean   ) OWNER TO store ;
REVOKE EXECUTE ON FUNCTION store.update_with_check( storg.docs.id%TYPE ,  boolean   )  FROM public;
GRANT EXECUTE ON FUNCTION store.update_with_check( store.docs.id%TYPE  ) TO service_functions;

āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻžāĻ°āĻŋ āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻ¨ā§€āĻ¤āĻŋ āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻ°ā§āĻ¨āĨ¤

āĻ¸āĻžāĻ°āĻŋ āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°ā§āĻ¨

ALTER TABLE store.docs ENABLE ROW LEVEL SECURITY ;

CREATE POLICY doc_select ON store.docs FOR SELECT TO service_functions USING ( (SELECT store.check_select(id)) );
CREATE POLICY doc_insert ON store.docs FOR INSERT TO service_functions WITH CHECK ( (SELECT store.check_insert(id)) );
CREATE POLICY docs_delete ON store.docs FOR DELETE TO service_functions USING ( (SELECT store.check_delete(id)) );

CREATE POLICY doc_update_using ON store.docs FOR UPDATE TO service_functions USING ( (SELECT store.update_using(id , is_del )) );
CREATE POLICY doc_update_check ON store.docs FOR UPDATE TO service_functions  WITH CHECK ( (SELECT store.update_with_check(id , is_del )) );

āĻĢāĻ˛āĻžāĻĢāĻ˛

āĻāĻŸāĻž āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĨ¤

āĻĒā§āĻ°āĻ¸ā§āĻ¤āĻžāĻŦāĻŋāĻ¤ āĻ•ā§ŒāĻļāĻ˛āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧāĻŋāĻ• āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡āĻ° āĻ¸ā§āĻ¤āĻ° āĻĨā§‡āĻ•ā§‡ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻ¸ā§āĻ¤āĻ°ā§‡ āĻ°ā§‹āĻ˛ āĻŽāĻĄā§‡āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻž āĻ¸āĻŽā§āĻ­āĻŦ āĻ•āĻ°ā§‡āĻ›ā§‡āĨ¤

āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ˛ā§‡ āĻĢāĻžāĻ‚āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ†āĻ°āĻ“ āĻĒāĻ°āĻŋāĻļā§€āĻ˛āĻŋāĻ¤ āĻĄā§‡āĻŸāĻž āĻ˛ā§āĻ•āĻžāĻ¨ā§‹āĻ° āĻŽāĻĄā§‡āĻ˛āĻ—ā§āĻ˛āĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŽāĻĒā§āĻ˛ā§‡āĻŸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

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