これが私が読んできたものです:
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
security-barrierを使用してビューを作成しようとしています:
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.`
テーブルに行レベルのセキュリティ バリアを実装するには、どのような手順が必要ですか?