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; 

เดตเดฐเดฟเด•เตพ เดคเดฟเดฐเตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต

เดšเต†เด•เตเด•เต_เด‡เตปเดธเต‡เตผเดŸเตเดŸเต

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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•