Sebagai pelengkap
Bagian teoretis dijelaskan dengan baik dalam dokumentasi
Tidak ada yang baru dalam artikel tersebut, tidak ada makna tersembunyi atau pengetahuan rahasia. Sekadar sketsa tentang implementasi praktis dari sebuah ide teoretis. Jika ada yang tertarik, bacalah. Jika Anda tidak tertarik, jangan buang waktu Anda.
Pernyataan masalah
Tanpa menyelami pokok bahasan secara mendalam, secara singkat permasalahan dapat dirumuskan sebagai berikut: Terdapat tabel yang mengimplementasikan suatu badan usaha tertentu. Baris dalam tabel dapat dihapus, namun baris tidak dapat dihapus secara fisik; baris tersebut harus disembunyikan.
Karena dikatakan: βJangan hapus apapun, ganti namanya saja. Internet menyimpan SEMUANYA"
Selama prosesnya, disarankan untuk tidak menulis ulang fungsi tersimpan yang berfungsi dengan entitas ini.
Untuk mengimplementasikan konsep ini, tabel memiliki atribut is_dihapus. Maka semuanya sederhana - Anda perlu memastikan bahwa klien hanya dapat melihat baris di mana atribut tersebut is_dihapus PALSU Untuk apa mekanisme tersebut digunakan? Keamanan Tingkat Baris.
Implementasi
Buat peran dan skema terpisah
CREATE ROLE repos;
CREATE SCHEMA repos;
Buat tabel target
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Kami termasuk Keamanan Tingkat 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 layanan β menghapus satu baris dalam tabel
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 bisnis β menghapus 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;
Temuan
Klien menghapus dokumen
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Setelah dihapus, klien tidak melihat dokumen tersebut
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Namun di database dokumen tersebut tidak dihapus, hanya atributnya saja 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)
Itulah yang diperlukan dalam rumusan masalah.
Total
Jika topiknya menarik, pada penelitian selanjutnya dapat menunjukkan contoh penerapan model berbasis peran untuk memisahkan akses data menggunakan Row Level Security.
Sumber: www.habr.com