แƒ™แƒ•แƒšแƒ”แƒ•แƒ PostgreSQL-แƒจแƒ˜ แƒ›แƒฌแƒ™แƒ แƒ˜แƒ•แƒ˜แƒก แƒ“แƒแƒœแƒ˜แƒก แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘

แƒ แƒแƒ’แƒแƒ แƒช แƒจแƒ”แƒ›แƒแƒ•แƒกแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ™แƒ•แƒšแƒ”แƒ•แƒ แƒ‘แƒ˜แƒ–แƒœแƒ”แƒก แƒšแƒแƒ’แƒ˜แƒ™แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ PostgreSQL แƒจแƒ”แƒœแƒแƒฎแƒฃแƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ–แƒ” ะธ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒแƒ“ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒ˜ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก on แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜.

แƒ—แƒ”แƒแƒ แƒ˜แƒฃแƒšแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒ™แƒแƒ แƒ’แƒแƒ“ แƒแƒ แƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒแƒจแƒ˜ 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)

แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒ˜ แƒแƒ  แƒ˜แƒจแƒšแƒ”แƒ‘แƒ, แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒขแƒ แƒ˜แƒ‘แƒฃแƒขแƒ˜ แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ แƒแƒ แƒ˜แƒก_แƒ“แƒ”แƒš

psql -d my_db
SELECT  id, name , is_del FROM repos.file ;
id |  name  | is_del
--+---------+------------
 1 |  test_1 | t
(1 row)

แƒ แƒแƒช แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒ“แƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒแƒจแƒ˜.

แƒกแƒฃแƒš

แƒ—แƒฃ แƒ—แƒ”แƒ›แƒ แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒแƒ, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ™แƒ•แƒšแƒ”แƒ•แƒแƒจแƒ˜ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒฉแƒ•แƒ”แƒœแƒแƒ— แƒ แƒแƒšแƒ”แƒ‘แƒ–แƒ” แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒ’แƒแƒœแƒชแƒแƒšแƒ™แƒ”แƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก Row Level Security แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ