แƒ แƒแƒšแƒ”แƒ‘แƒ–แƒ” แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ Row Level Security PostgreSQL-แƒจแƒ˜

แƒ—แƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ แƒ™แƒ•แƒšแƒ”แƒ•แƒ PostgreSQL-แƒจแƒ˜ แƒ›แƒฌแƒ™แƒ แƒ˜แƒ•แƒ˜แƒก แƒ“แƒแƒœแƒ˜แƒก แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ ะธ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒ˜ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก on แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜.

แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒขแƒ แƒแƒขแƒ”แƒ’แƒ˜แƒ แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก "แƒ‘แƒ˜แƒ–แƒœแƒ”แƒกแƒ˜แƒก แƒšแƒแƒ’แƒ˜แƒ™แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜" แƒ™แƒแƒœแƒชแƒ”แƒคแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒชแƒแƒขแƒ แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒ˜แƒงแƒ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒแƒฅ - แƒ™แƒ•แƒšแƒ”แƒ•แƒ แƒ‘แƒ˜แƒ–แƒœแƒ”แƒก แƒšแƒแƒ’แƒ˜แƒ™แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ PostgreSQL แƒจแƒ”แƒœแƒแƒฎแƒฃแƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ–แƒ”

แƒ—แƒ”แƒแƒ แƒ˜แƒฃแƒšแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒ™แƒแƒ แƒ’แƒแƒ“ แƒแƒ แƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒแƒจแƒ˜ PostgreSQL - แƒ แƒ˜แƒ’แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒชแƒ•แƒ˜แƒก แƒžแƒแƒšแƒ˜แƒขแƒ˜แƒ™แƒ. แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜แƒ แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒฃแƒšแƒ˜ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒ‘แƒ˜แƒ–แƒœแƒ”แƒก แƒแƒ›แƒแƒชแƒแƒœแƒ - แƒ›แƒ˜แƒกแƒแƒ‘แƒแƒซแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ แƒแƒšแƒ”แƒ‘แƒ–แƒ” แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ Row Level Security 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 แƒ แƒ˜แƒ’แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒฃแƒœแƒแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ

check_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; 

แƒ แƒ˜แƒ’แƒ”แƒ‘แƒ˜แƒก แƒฉแƒแƒกแƒ›แƒ˜แƒก แƒฃแƒœแƒแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ

แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ_แƒฉแƒแƒกแƒ›แƒ

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; 

แƒ›แƒฌแƒ™แƒ แƒ˜แƒ•แƒ˜แƒก แƒฌแƒแƒจแƒšแƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ

แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ_แƒฌแƒแƒจแƒšแƒ

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;

แƒ›แƒฌแƒ™แƒ แƒ˜แƒ•แƒ˜แƒก แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ.

แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ_แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ

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

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ