Вот что я читал:
http://www.postgresql.org/docs/9.2/static/rules-views.html
http://www.postgresql.org/docs/9.2/static/rules-privileges.html
Моя цель - позволить логину видеть только те строки, которые ему, так сказать, «принадлежат».
Допустим, каждая таблица в базе данных наследуется от этой таблицы:
create table WHOAMI
(
tenant varchar(25) not null default current_user
);
Например:
create table FOO
(
id int primary key,
invoicedate date
) inherits (WHOAMI);
insert into FOO(id, invoicedate) values(1,now()::date);
select * from FOO;
--abclogin|1|2013-02-01
Есть ли в PostgreSQL такая вещь, как правило выбора на уровне схемы, влияющее на все таблицы и представления в схеме, которое добавляет к каждому оператору выбора, вставки, обновления или удаления условие, которое гласит: эффект, ..AND WHERE TENANT = current_user
? Если такого глобального правила нет, можно ли его применять для каждой таблицы? Мои попытки не увенчались успехом, и, вероятно, я неправильно понимаю некоторые вещи о том, как создаются правила. Вот что я пытался сделать:
Я пытаюсь создать правило выбора:
CREATE RULE "_RETURN" AS ON SELECT TO FOO DO INSTEAD
SELECT * FROM FOO where tenant = current_user;
но получаю эту ошибку: ERROR: could not convert table "foo" to a view because it has indexes
Я пытаюсь создать представление с барьером безопасности:
CREATE VIEW TENANTFOO WITH (security_barrier) AS
SELECT * FROM FOO WHERE tenant=current_user;
а затем попробуйте вставить:
insert into TENANTFOO(id,invoicedate)
values(2,(now()::date);
но получите эту ошибку:
`ERROR: cannot insert into view "tenantfoo"
HINT: You need an unconditional ON INSERT DO INSTEAD rule
or an INSTEAD OF INSERT trigger.`
Какие шаги необходимы для реализации барьеров безопасности на уровне строк в таблицах?