【发布时间】:2018-04-24 13:10:02
【问题描述】:
我有一个 PostgreSQL 9.5 数据库:
- 存储字段可能值的表 test.domain(int id, text value)。这些数据是动态的。
- 一个表 test.table(id int, domainn text),其中 domainn 字段引用了 test.domain 表。
- 一个视图 test.view_domain,它是 test.domain 的一个视图。
我已经使用视图上的安全定义器选项定义了 INSTEAD 触发器。此触发器更新表 test.domain。问题是,尽管这个触发器是作为用户“system”执行的,但表 test.table 上的引用更新是由调用者用户执行的。
这是一个示例,如果作为 postgres 执行,我希望得到“用户系统”作为错误而不是“用户 postgres”
drop schema IF EXISTS test cascade;
create schema test;
create function test.modified() returns trigger as
$$
BEGIN
raise exception 'user %', ' '||current_user;
END
$$
language plpgsql;
set role system;
create function test.insert_with_system() returns trigger as
$$
DECLARE
valor text;
BEGIN
--raise exception 'user %', ' '||current_user;
update test.domain set value = ''||new.value where id = new.id;
END
$$ language plpgsql security definer;
reset role;
CREATE table test.domain(
id int primary key,
value text unique
);
create view test.domain_view as select * from test.domain;
create table test.table(
id int primary key,
domainn text
);
alter table test.table add foreign key (domainn)
references test.domain(value) on delete restrict on update cascade;
create trigger test_trigger before insert or update or delete on test.table
for each row execute procedure test.modified();
create trigger instead_ins INSTEAD OF update or delete on test.domain_view
for each row execute procedure test.insert_with_system();
insert into test.domain(id, value) values(1,'one');
alter table test.table DISABLE TRIGGER all;
insert into test.table(id, domainn) values (0,'one');
alter table test.table enable TRIGGER all;
update test.domain_view set value = 'two';
select * from test.table;
【问题讨论】:
标签: postgresql plpgsql