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

අදහස් එක් කරන්න