แž€แžถแžšแžŸแžทแž€แŸ’แžŸแžถแž›แžพแž€แžถแžšแžขแž“แžปแžœแžแŸ’แž Row Level Security แž“แŸ…แž€แŸ’แž“แžปแž„ PostgreSQL

แž‡แžถแž€แžถแžšแž”แŸ†แž–แŸแž‰แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ… แž€แžถแžšแžŸแžทแž€แŸ’แžŸแžถแžขแŸ†แž–แžธแž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแžแž€แŸ’แž€แžœแžทแž‡แŸ’แž‡แžถแžขแžถแž‡แžธแžœแž€แž˜แŸ’แž˜แž“แŸ…แž€แž˜แŸ’แžšแžทแžแž“แŸƒแž˜แžปแžแž„แžถแžšแžŠแŸ‚แž›แž”แžถแž“แžšแž€แŸ’แžŸแžถแž‘แžปแž€ PostgreSQL ะธ แž‡แžถแž…แž˜แŸ’แž”แž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž…แž˜แŸ’แž›แžพแž™แž›แž˜แŸ’แžขแžทแž แž“แŸ…แž›แžพ แžขแžแŸ’แžแžถแž’แžทแž”แŸ’แž”แžถแž™.

แž•แŸ’แž“แŸ‚แž€แž‘แŸ’แžšแžนแžŸแŸ’แžแžธแžแŸ’แžšแžผแžœแž”แžถแž“แž–แžทแž–แžŽแŸŒแž“แžถแž™แŸ‰แžถแž„แž›แŸ’แžขแž“แŸ…แž€แŸ’แž“แžปแž„แžฏแž€แžŸแžถแžš PostgreSQL - แž‚แŸ„แž›แž€แžถแžšแžŽแŸแž€แžถแžšแž–แžถแžšแž‡แžฝแžš. แžแžถแž„แž€แŸ’แžšแŸ„แž˜แž“แŸแŸ‡แž‡แžถแž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แž“แŸƒแžแžผแž…แž˜แžฝแž™ แž—แžถแžšแž€แžทแž…แŸ’แž…แžขแžถแž‡แžธแžœแž€แž˜แŸ’แž˜แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹ - แž›แžถแž€แŸ‹แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŠแŸ‚แž›แž”แžถแž“แž›แžปแž”แŸ” แž‚แŸ†แž“แžผแžšแž–แŸ’แžšแžถแž„แžงแž‘แŸ’แž‘แžทแžŸแžŠแž›แŸ‹แž€แžถแžšแžขแž“แžปแžœแžแŸ’แž แž€แžถแžšแž’แŸ’แžœแžพแž‚แŸ†แžšแžผแžŠแŸ„แž™แž”แŸ’แžšแžพ RLS แž”แž„แŸ’แž แžถแž‰แžŠแŸ„แž™แžกแŸ‚แž€แž–แžธแž‚แŸ’แž“แžถแŸ”

แž€แžถแžšแžŸแžทแž€แŸ’แžŸแžถแž›แžพแž€แžถแžšแžขแž“แžปแžœแžแŸ’แž Row Level Security แž“แŸ…แž€แŸ’แž“แžปแž„ 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

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹