๋ณด์์ฑ
์ผ๋ก๋
์ด๋ก ์ ์ธ ๋ถ๋ถ์ ๋ฌธ์์ ์ ์ค๋ช
๋์ด ์์ต๋๋ค.
๊ธฐ์ฌ์๋ ์๋ก์ด ๋ด์ฉ์ด ์์ผ๋ฉฐ ์จ๊ฒจ์ง ์๋ฏธ๋ ๋น๋ฐ ์ง์๋ ์์ต๋๋ค. ์ด๋ก ์ ์์ด๋์ด์ ์ค์ ๊ตฌํ์ ๋ํ ์ค์ผ์น์ ๋๋ค. ๋๊ตฌ๋ ์ง ๊ด์ฌ์ด ์๋ค๋ฉด ์ฝ์ด๋ณด์ธ์. ๊ด์ฌ์ด ์๋ค๋ฉด ์๊ฐ์ ๋ญ๋นํ์ง ๋ง์ญ์์ค.
๋ฌธ์ ์ฑ๋ช
์ฃผ์ ์์ญ์ ๊น์ด ํ๊ณ ๋ค์ง ์๊ณ ๊ฐ๋จํ ๋ฌธ์ ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ณต์ํํ ์ ์์ต๋๋ค. ํน์ ๋น์ฆ๋์ค ์ํฐํฐ๋ฅผ ๊ตฌํํ๋ ํ ์ด๋ธ์ด ์์ต๋๋ค. ํ ์ด๋ธ์ ํ์ ์ญ์ ํ ์ ์์ง๋ง ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ญ์ ํ ์๋ ์์ผ๋ฏ๋ก ์จ๊ฒจ์ผ ํฉ๋๋ค.
โ์๋ฌด ๊ฒ๋ ์ญ์ ํ์ง ๋ง๊ณ ์ด๋ฆ์ ๋ฐ๊พธ์ธ์. ์ธํฐ๋ท์ ๋ชจ๋ ๊ฒ์ ์ ์ฅํ๋ค"
๊ทธ ๊ณผ์ ์์ ์ด ์ํฐํฐ์ ์๋ํ๋ ๊ธฐ์กด ์ ์ฅ ํจ์๋ฅผ ๋ค์ ์์ฑํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด ๊ฐ๋ ์ ๊ตฌํํ๊ธฐ ์ํด ํ ์ด๋ธ์๋ ์์ฑ์ด ์์ต๋๋ค. ์ญ์ ๋จ. ๊ทธ๋ฌ๋ฉด ๋ชจ๋ ๊ฒ์ด ๊ฐ๋จํด์ง๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์์ฑ์ด ํฌํจ๋ ํ๋ง ๋ณผ ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ญ์ ๋จ ๊ฑฐ์ง ๋ฉ์ปค๋์ฆ์ ๋ฌด์์ ์ํด ์ฌ์ฉ๋ฉ๋๊น? ํ ์์ค ๋ณด์.
ะ ะตะฐะปะธะทะฐัะธั
๋ณ๋์ ์ญํ ๋ฐ ์คํค๋ง ์์ฑ
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)
๋ฌธ์ ์ค๋ช ์์ ์๊ตฌ๋๋ ๋ด์ฉ์ ๋๋ค.
ํฉ๊ณ
์ฃผ์ ๊ฐ ํฅ๋ฏธ๋กญ๋ค๋ฉด ๋ค์ ์ฐ๊ตฌ์์ ํ ์์ค ๋ณด์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ก์ธ์ค๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํ ์ญํ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ๊ตฌํํ๋ ์๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
์ถ์ฒ : habr.com