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;
С того времени, как я его здесь выкладывал, там многое изменилось (уже
не мной). Например, селективность индекса теперь считается.