Studium de exsequendo Row Level Securitatis in PostgreSQL

Ut complementum Studium logicae negotii exsequendi in ambitu functionum PostgreSQL conditarum ΠΈ maxime ad singula respondere on comment.

Pars theorica optime describitur in documentis PostgreSQL - Row praesidium policies. Infra est exsecutio parva negotium negotium certis - latebras delevit data. Sciagraphia dicata ad implementation Munus modeling utens RLS sigillatim.

Studium de exsequendo Row Level Securitatis in PostgreSQL

Nihil novi in ​​articulo, non est occulta significatio vel scientia secreta. Iustus adumbratio circa exsecutionem ideae theoreticae. Si quis interroget, lege hoc. Si non quaero, ne tempus perdis.

DE PECCATO quaestio

Sine penitus in subjectam partem tribuo, problema sic breviter enuntiari potest; Mensa est quae quoddam negotium ens conficit. Ordines in tabella deleri possunt, sed ordines physice deleri non possunt, occultari debent.

Dicitur enim: β€œNihil dele, modo illud nomen. Penitus recondit OMNIA "

Per viam, opportunum est functiones reconditas existentium rescribere quae cum hac re operantur.

Ad hunc notionem efficiendum, mensa habet attributum is_deleted. Tunc omnia simplicia sunt - opus fac ut cliens solas lineas in quibus attributum videre possit is_deleted falsus Quid est mechanism usus est? Row Level Securitatis.

РСализация

Partes singulas crea et schema

CREATE ROLE repos;
CREATE SCHEMA repos;

Creare in scopum in mensa

CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos

includuntur Level row Security

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 ;

Munus muneris - delendo row in mensa

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;

Negotium munus - delendo documentum

CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM  repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

Cliens delet documentum

SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );

Post deletionem, cliens documentum non videt

SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)

Sed documentum in datorum non deletur, solum attributum mutatur is_del

psql -d my_db
SELECT  id, name , is_del FROM repos.file ;
id |  name  | is_del
--+---------+------------
 1 |  test_1 | t
(1 row)

Id quod requirebatur in problemate propositione.

exitum

Si locus interesting est, in proximo studio exemplum monstrare potes exsequendi munus substructum exemplar ad notitias dividendas accessus utendi Row Level Securitatis.

Source: www.habr.com