这是我一直在阅读的内容:
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.`
在表上实现行级安全屏障需要哪些步骤?