แ แแแแ แช แจแแแแแกแแแแแ
แแแแ แแฃแแ แแแฌแแแ แแแ แแแ แแ แแก แแฆแฌแแ แแแ แแแแฃแแแแขแแชแแแจแ
แกแขแแขแแแจแ แแฎแแแ แแ แแคแแ แแ, แแ แแ แแก แคแแ แฃแแ แแแแจแแแแแแแ แแ แกแแแแฃแแแ แชแแแแ. แแฎแแแแ แแกแแแแ แแแแ แแฃแแ แแแแแก แแ แแฅแขแแแฃแแ แแแแฎแแ แชแแแแแแแก แจแแกแแฎแแ. แแฃ แแแแแแก แแแแขแแ แแกแแแก, แฌแแแแแแฎแแ. แแฃ แแ แแแแแขแแ แแกแแแ, แแฃ แแแแแ แแแแ แแ แแก.
แแ แแแแแแแก แจแแกแแฎแแ แแแแชแฎแแแแแ
แแแแแแ, แแแแแก แแ แแจแ แฆแ แแแ แฉแแซแแ แแแก แแแ แแจแ, แแ แแแแแแ แจแแแซแแแแ แฉแแแแงแแแแแแแก แจแแแแแแแแแ แแ: แแ แกแแแแแก แชแฎแ แแแ, แ แแแแแแช แแฎแแ แชแแแแแแก แแแ แแแแฃแ แแแแแแก แกแฃแแแแฅแขแก. แชแฎแ แแแแก แ แแแแแ แจแแแซแแแแ แฌแแแจแแแแก, แแแแ แแ แ แแแแแ แคแแแแแฃแ แแ แแ แฌแแแจแแแแ; แแกแแแ แฃแแแ แแงแแก แแแแแแฃแแ.
แ แแแแแ แแแแฅแแแแแ: โแแ แแคแแ แ แแ แฌแแจแแแ, แฃแแ แแแแ แแแแแแ แฅแแ แกแแฎแแแ. แแแขแแ แแแขแ แแแแฎแแแก แงแแแแแคแแ แก"
แแแแแ, แแแแแแจแแฌแแแแแแ แแ แแแแแฌแแ แแ แแ แกแแแฃแแ แจแแแแฎแฃแแ แคแฃแแฅแชแแแแ, แ แแแแแแแช แแฃแจแแแแแ แแ แแ แแแฃแแแแ.
แแ แแแแชแแคแชแแแก แแแแกแแฎแแ แชแแแแแแแแ, แชแฎแ แแแก แแฅแแก แแขแ แแแฃแขแ แแ แแก_ แฌแแจแแแแ. แแแจแแ แงแแแแแคแแ แ แแแ แขแแแแ - แแฅแแแ แฃแแแ แแแ แฌแแฃแแแแ, แ แแ แแแแแแขแก แจแแฃแซแแแ แแแฎแแก แแฎแแแแ แแก แฎแแแแแ, แ แแแแแแจแแช แแขแ แแแฃแขแแ แแ แแก_ แฌแแจแแแแ แงแแแแ แ แแกแแแแก แแแแแแงแแแแแ แแแฅแแแแแแ? แแฌแแ แแแแก แแแแแก แฃแกแแคแ แแฎแแแแ.
ะ ะตะฐะปะธะทะฐัะธั
แจแแฅแแแแแ แชแแแแ แ แแแ แแ แกแฅแแแ
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