PostgreSQL เจตเจฟเฉฑเจš เจฐเฉ‹เจฒ เจฒเฉˆเจตเจฒ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจฐเฉ‹เจฒ เจ…เจงเจพเจฐเจค เจเจ•เจธเฉˆเจธ เจฎเจพเจกเจฒ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจฅเฉ€เจฎ เจตเจฟเจ•เจพเจธ 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;

update_check

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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹