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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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 Content-Type Size
row_acl.tgz application/x-compressed-tar 15.3 KB

In response to

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Andrey N. Oktyabrski 2007-09-27 07:44:42 Re: management of BLOBs
Previous Message Dmitry Turin 2007-09-27 05:58:17 Re: management of BLOBs