Sebagai pelengkap kepada
Bahagian teori diterangkan dengan baik dalam dokumentasi
Tidak ada yang baru dalam artikel itu, tidak ada makna tersembunyi atau pengetahuan rahsia. Sekadar lakaran tentang pelaksanaan praktikal sesuatu idea teori. Jika ada yang berminat, bacalah. Jika anda tidak berminat, jangan buang masa anda.
Pernyataan masalah
Tanpa menyelam secara mendalam ke dalam kawasan subjek, secara ringkas, masalah boleh dirumuskan seperti berikut: Terdapat jadual yang melaksanakan entiti perniagaan tertentu. Baris dalam jadual boleh dipadamkan, tetapi baris tidak boleh dipadamkan secara fizikal; mereka mesti disembunyikan.
Kerana dikatakan: "Jangan padam apa-apa, hanya namakan ia. Internet menyimpan SEGALANYA"
Sepanjang perjalanan, adalah dinasihatkan untuk tidak menulis semula fungsi tersimpan sedia ada yang berfungsi dengan entiti ini.
Untuk melaksanakan konsep ini, jadual mempunyai atribut is_deleted. Kemudian segala-galanya adalah mudah - anda perlu memastikan bahawa pelanggan boleh melihat hanya baris di mana atribut is_deleted salah Apakah mekanisme yang digunakan? Keselamatan Tahap Baris.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
Buat peranan dan skema yang berasingan
CREATE ROLE repos;
CREATE SCHEMA repos;
Buat jadual sasaran
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Kami merangkumi Keselamatan Tahap Baris
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 ;
Fungsi perkhidmatan β memadam baris dalam jadual
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;
Fungsi perniagaan β memadam dokumen
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Penemuan
Pelanggan memadamkan dokumen
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Selepas pemadaman, pelanggan tidak melihat dokumen itu
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Tetapi dalam pangkalan data dokumen itu tidak dipadamkan, hanya atribut yang diubah is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Apakah yang diperlukan dalam pernyataan masalah.
Jumlah
Jika topik itu menarik, dalam kajian seterusnya anda boleh menunjukkan contoh pelaksanaan model berasaskan peranan untuk memisahkan akses data menggunakan Keselamatan Tahap Baris.
Sumber: www.habr.com