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 |
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 |