āĻāĻāĻāĻŋ āĻĒāĻ°āĻŋāĻĒā§āĻ°āĻ āĻšāĻŋāĻ¸āĻžāĻŦā§
āĻ¤āĻžāĻ¤ā§āĻ¤ā§āĻŦāĻŋāĻ āĻ
āĻāĻļāĻāĻŋ āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨ā§ āĻāĻžāĻ˛āĻāĻžāĻŦā§ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§
āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§ āĻ¨āĻ¤ā§āĻ¨ āĻāĻŋāĻā§ āĻ¨ā§āĻ, āĻā§āĻ¨ āĻā§āĻĒāĻ¨ āĻ āĻ°ā§āĻĨ āĻŦāĻž āĻā§āĻĒāĻ¨ āĻā§āĻāĻžāĻ¨ āĻ¨ā§āĻāĨ¤ āĻāĻāĻāĻŋ āĻ¤āĻžāĻ¤ā§āĻ¤ā§āĻŦāĻŋāĻ āĻ§āĻžāĻ°āĻŖāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻļā§āĻ§ā§ āĻāĻāĻāĻŋ āĻ¸ā§āĻā§āĻāĨ¤ āĻā§āĻ āĻāĻā§āĻ°āĻšā§ āĻšāĻ˛ā§ āĻĒāĻĄāĻŧā§āĻ¨āĨ¤ āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻā§āĻ°āĻšā§ āĻ¨āĻž āĻšāĻ¨ āĻ¤āĻŦā§ āĻāĻĒāĻ¨āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¨āĻˇā§āĻ āĻāĻ°āĻŦā§āĻ¨ āĻ¨āĻžāĨ¤
āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻāĻ āĻ¨
āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻāĻ˛āĻžāĻāĻžāĻ¯āĻŧ āĻāĻā§āĻ°āĻāĻžāĻŦā§ āĻĄā§āĻŦ āĻ¨āĻž āĻĻāĻŋāĻ¯āĻŧā§, āĻ¸āĻāĻā§āĻˇā§āĻĒā§, āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻāĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§āĻĒ āĻĒā§āĻ°āĻŖāĻ¯āĻŧāĻ¨ āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§: āĻāĻāĻāĻŋ āĻā§āĻŦāĻŋāĻ˛ āĻāĻā§ āĻ¯āĻž āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧāĻŋāĻ āĻ¸āĻ¤ā§āĻ¤āĻž āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻāĻ°ā§āĨ¤ āĻā§āĻŦāĻŋāĻ˛ā§āĻ° āĻ¸āĻžāĻ°āĻŋāĻā§āĻ˛āĻŋ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻžāĻ°āĻŋāĻā§āĻ˛āĻŋ āĻļāĻžāĻ°ā§āĻ°āĻŋāĻāĻāĻžāĻŦā§ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž āĻ¯āĻžāĻŦā§ āĻ¨āĻž; āĻ¸ā§āĻā§āĻ˛āĻŋ āĻ āĻŦāĻļā§āĻ¯āĻ āĻ˛ā§āĻāĻŋāĻ¯āĻŧā§ āĻ°āĻžāĻāĻ¤ā§ āĻšāĻŦā§ā§ˇ
āĻāĻžāĻ°āĻŖ āĻāĻāĻŋ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧā§āĻā§: "āĻā§āĻ¨āĻ āĻāĻŋāĻā§ āĻŽā§āĻāĻŦā§āĻ¨ āĻ¨āĻž, āĻā§āĻŦāĻ˛ āĻāĻāĻŋāĻ° āĻ¨āĻžāĻŽ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°ā§āĻ¨āĨ¤ āĻāĻ¨ā§āĻāĻžāĻ°āĻ¨ā§āĻ āĻ¸āĻŦ āĻāĻŋāĻā§ āĻ¸āĻā§āĻāĻ¯āĻŧ āĻāĻ°ā§"
āĻĒāĻĨ āĻŦāĻ°āĻžāĻŦāĻ°, āĻāĻ āĻ¸āĻ¤ā§āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°ā§ āĻāĻŽāĻ¨ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻ¸āĻā§āĻāĻŋāĻ¤ āĻĢāĻžāĻāĻļāĻ¨āĻā§āĻ˛āĻŋāĻā§ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ˛ā§āĻāĻž āĻ¨āĻž āĻāĻ°āĻžāĻ° āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻā§āĻā§ā§ˇ
āĻāĻ āĻ§āĻžāĻ°āĻŖāĻžāĻāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻā§āĻŦāĻŋāĻ˛ā§āĻ° āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ āĻ°āĻ¯āĻŧā§āĻā§ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž āĻšāĻ¯āĻŧā§āĻā§. āĻ¤āĻžāĻ°āĻĒāĻ° āĻ¸āĻŦāĻāĻŋāĻā§ āĻ¸āĻšāĻ - āĻāĻĒāĻ¨āĻžāĻā§ āĻ¨āĻŋāĻļā§āĻāĻŋāĻ¤ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ āĻ¯ā§ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻā§āĻŦāĻ˛āĻŽāĻžāĻ¤ā§āĻ° āĻ¸ā§āĻ āĻ˛āĻžāĻāĻ¨āĻā§āĻ˛āĻŋ āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻ¯ā§āĻāĻžāĻ¨ā§ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯āĻāĻŋ āĻ°āĻ¯āĻŧā§āĻā§ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž āĻšāĻ¯āĻŧā§āĻā§ āĻŽāĻŋāĻĨā§āĻ¯āĻž āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻŋ āĻāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧ? āĻ¸āĻžāĻ°āĻŋ āĻ¸ā§āĻ¤āĻ° āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž.
āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨
āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ āĻā§āĻŽāĻŋāĻāĻž āĻāĻŦāĻ āĻ¸ā§āĻāĻŋāĻŽāĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨
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