この理論は、PostgreSQLのドキュメント-行セキュリティポリシーで詳しく説明されています。以下は、削除されたデータを非表示にする、小さな特定のビジネスタスクの実際的な実装です。RLSを使用したロールモデルの実装に関する研究は、個別に提示されます。

この記事は新しいものではなく、隠された意味や秘密の知識はありません。理論的アイデアの実際の実装についての単なるスケッチ。興味のある方は、読み進めてください。興味のない人-あなたの時間を無駄にしないでください。
問題の定式化
主題分野に深く踏み込むことなく、簡単に言えば、タスクは次のように定式化できます。特定の事業体を実装するテーブルがあります。テーブル内の行は削除できますが、行を物理的に削除することはできません。行を非表示にする必要があります。
「何も削除せず、名前を変更するだけです。インターネットはすべてを保存します "
途中で、このエンティティで動作する既存の保存された関数を書き直さないことをお勧めします。
この概念を実装するために、テーブルにはis_deleted属性があります。次に、すべてが単純です。クライアントがis_deleted属性がfalseである行のみを表示できるようにする必要があります。行レベルのセキュリティメカニズムが使用されているもの。
実装
別の役割とスキーマを作成する
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)
これは、問題の定式化に必要なものです。
結果
トピックが興味深い場合は、次のエチュードで、行レベルのセキュリティを使用してデータアクセスを共有するための役割ベースのモデルを実装する例を示すことができます。