Skip site navigation (1) Skip section navigation (2)

Re: management of BLOBs

From: "Andrey N(dot) Oktyabrski" <ano(at)antora(dot)ru>
To: Dmitry Turin <sql4-en(at)narod(dot)ru>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: management of BLOBs
Date: 2007-09-27 06:50:42
Message-ID: 46FB52C2.8030800@antora.ru (view raw or flat)
Thread:
Lists: pgsql-ru-general
Dmitry Turin wrote:
> Я должен хранить файлы (BLOB-ы) с 3 параметрами
> и контролировать доступ пользователей к ним.
> Общий объем файлов 2,5 Гб, что меньше, чем 32 Тб
> (максимальный размер таблицы в pg).
> 66% файлов имеют размер около 10-20 Kb,
> 33% файлов имеют размер около 150-200 Kb, что меньше, чем 1Гб
> (максимальный размер поля в pg).
> 
> Я внимательно изучил http://pgfoundry.org, http://gborg.postgresql.org,
> но не нажел подходящего инструмента.
> Посоветуйте какой-нибудь бесплатный софт.
Я уже выкладывал тут свою поделку для разделения доступа. Если это то, 
что надо, пользоваться так:
\i row_acl.sql

-- OBJECT with rights and parameters
CREATE TABLE _blob (
   id            SERIAL,
   usr           TEXT NOT NULL CHECK (usr ~ '^[A-Za-z0-9_]+$'),
   grp           TEXT NOT NULL CHECK (grp ~ '^[A-Za-z0-9_]+$'),
   param         HSTORE NOT NULL DEFAULT '',
   file          BYTEA
);

CREATE VIEW blob AS SELECT * FROM _blob o
   WHERE session_user = 'admin'
      OR o.acl && 'o+r'
      OR o.acl && 'u+r' AND  o.usr = session_user
      OR o.acl && 'g+r' AND (pg_has_role(session_user, o.grp, 'member'));

CREATE RULE blob_ins AS ON INSERT TO blob DO INSTEAD
   INSERT INTO _blob (usr, grp, acl, param, file)
   VALUES (new.usr, new.grp, new.acl, new.param, new.file);

CREATE RULE blob_upd AS ON UPDATE TO blob DO INSTEAD
   UPDATE _blob
   SET id = new.id, usr = new.usr, grp = new.grp, acl = new.acl, param = 
new.param, file = new.file
   WHERE id = new.id AND (
         o.acl && 'o+w'
      OR o.acl && 'u+w' AND  o.usr = session_user
      OR o.acl && 'g+w' AND (pg_has_role(session_user, o.grp, 'member'));
   );

CREATE RULE blob_del AS ON DELETE TO blob DO INSTEAD
   DELETE FROM _blob
   WHERE id = old.id AND (
         o.acl && 'o+w'
      OR o.acl && 'u+w' AND  o.usr = session_user
      OR o.acl && 'g+w' AND (pg_has_role(session_user, o.grp, 'member'));
   );

REVOKE select, insert, update, delete ON _blob FROM PUBLIC;
GRANT  select, insert, update, delete ON blob  TO   PUBLIC;

С того времени, как я его здесь выкладывал, там многое изменилось (уже 
не мной). Например, селективность индекса теперь считается.

Attachment: row_acl.tgz
Description: application/x-compressed-tar (15.3 KB)

In response to

Responses

pgsql-ru-general by date

Next:From: Andrey N. OktyabrskiDate: 2007-09-27 07:44:42
Subject: Re: management of BLOBs
Previous:From: Dmitry TurinDate: 2007-09-27 05:58:17
Subject: Re: management of BLOBs

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group