Re: management of BLOBs

Поиск
Список
Период
Сортировка
От Andrey N. Oktyabrski
Тема Re: management of BLOBs
Дата
Msg-id 46FB52C2.8030800@antora.ru
обсуждение исходный текст
Ответ на management of BLOBs  (Dmitry Turin <sql4-en@narod.ru>)
Ответы Re: management of BLOBs
Re: management of BLOBs
Список 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;

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

Вложения

В списке pgsql-ru-general по дате отправления:

Предыдущее
От: Dmitry Turin
Дата:
Сообщение: Re: management of BLOBs
Следующее
От: "Andrey N. Oktyabrski"
Дата:
Сообщение: Re: management of BLOBs