Қосымша ретінде
Теориялық бөлім құжаттамада жақсы сипатталған
Мақалада ешқандай жаңалық жоқ, жасырын мағына немесе құпия білім жоқ. Тек теориялық идеяны іс жүзінде жүзеге асыру туралы эскиз. Егер біреуді қызықтырса, оқыңыз. Егер сізді қызықтырмаса, уақытыңызды босқа өткізбеңіз.
Мәселенің тұжырымы
Пәндік салаға терең бойламай, қысқаша мәселені келесідей тұжырымдауға болады: Белгілі бір шаруашылық субъектісін жүзеге асыратын кесте бар. Кестедегі жолдарды жоюға болады, бірақ жолдарды физикалық түрде жою мүмкін емес, оларды жасыру керек.
Өйткені: «Ештеңені жоймаңыз, оның атын өзгертіңіз. Интернет барлығын сақтайды»
Жол бойында осы нысанмен жұмыс істейтін бар сақталған функцияларды қайта жазбаған жөн.
Бұл тұжырымдаманы жүзеге асыру үшін кестеде атрибут болады жойылды. Сонда бәрі қарапайым - клиент тек атрибут бар жолдарды көре алатынына көз жеткізу керек жойылды жалған Механизм не үшін қолданылады? Қатар деңгейінің қауіпсіздігі.
Реализация
Бөлек рөл мен схеманы жасаңыз
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)
Бұл мәселе мәлімдемесінде талап етілетін нәрсе.
Нәтиже
Тақырып қызықты болса, келесі зерттеуде Row Level Security көмегімен деректерге қол жеткізуді бөлудің рөлдік үлгісін іске асыру мысалын көрсете аласыз.
Ақпарат көзі: www.habr.com