PostgreSQL-เตฝ เดฑเต‹ เดฒเต†เดตเตฝ เดธเต†เด•เตเดฏเต‚เดฐเดฟเดฑเตเดฑเดฟ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด’เดฐเต เดชเด เดจเด‚

เดชเต‚เดฐเด•เดฎเดพเดฏเดฟ PostgreSQL เดธเด‚เดญเดฐเดฟเดšเตเดš เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เดคเดฒเดคเตเดคเดฟเตฝ เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดฒเต‹เดœเดฟเด•เต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด’เดฐเต เดชเด เดจเด‚ ะธ เดชเตเดฐเดงเดพเดจเดฎเดพเดฏเตเด‚ เดตเดฟเดถเดฆเดฎเดพเดฏ เด‰เดคเตเดคเดฐเดคเตเดคเดฟเดจเดพเดฏเดฟ เด“เตบ เด•เดฎเดจเตเดฑเดฑเดฟ.

เดธเตˆเดฆเตเดงเดพเดจเตเดคเดฟเด• เดญเดพเด—เด‚ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเดจเดฟเตฝ เดจเดจเตเดจเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต PostgreSQL - เดตเดฐเดฟ เดธเด‚เดฐเด•เตเดทเดฃ เดจเดฏเด™เตเด™เตพ. เด’เดฐเต เดšเต†เดฑเดฟเดฏ เด’เดฐเต เดชเตเดฐเดพเดฏเต‹เด—เดฟเด• เดจเดŸเดชเตเดชเดพเด•เตเด•เตฝ เดคเดพเดดเต† เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดŸเดพเดธเตเด•เต - เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดฟเดฏ เดกเดพเดฑเตเดฑ เดฎเดฑเดฏเตเด•เตเด•เตฝ. เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดธเดฎเตผเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเตเด•เต†เดšเตเดšเต RLS เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฑเต‹เตพ เดฎเต‹เดกเดฒเดฟเด‚เด—เต เดชเตเดฐเดคเตเดฏเต‡เด•เด‚ เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเดšเตเดšเต.

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

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