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

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