我有一个实体关系模型,我试图尊重规范化规则。但是为了通过PostGIS进入QGIS并且目前只有相关数据,我想通过一些视图,将这些视图显示到QGIS中,并可能根据视图中的修改更新相应的表。
例如,我有三个表,其中cable是包含我必须使用的数据的表,modele_cable包含一些填充视图的信息的引用表(弱实体),type_cable是modele_table的弱实体,也包含视图中的一些相关信息。就这样:
CREATE TABLE test.cable(
id_cable serial NOT NULL,
id_modele_cable integer,
geom geometry(MultiLineString,2154),
CONSTRAINT prk_constraint_cable PRIMARY KEY (id_cable),
CONSTRAINT fk_cable_id_modele_cable FOREIGN KEY (id_modele_cable)
REFERENCES test.modele_cable (id_modele_cable)
);
CREATE TABLE test.modele_cable(
id_modele_cable serial NOT NULL,
id_type_cable integer,
CONSTRAINT prk_constraint_modele_cable PRIMARY KEY (id_modele_cable),
CONSTRAINT fk_modele_cable_id_type_cable FOREIGN KEY (id_type_cable)
REFERENCES test.type_cable (id_type_cable)
);
CREATE TABLE test.type_cable(
id_type_cable serial NOT NULL,
nb_fo integer,
CONSTRAINT prk_constraint_type_cable PRIMARY KEY (id_type_cable)
);
CREATE VIEW public.cable_ok AS
SELECT cable.id_cable,
cable.designation,
type_cable.nb_fo,
cable.geom
FROM test.cable
LEFT JOIN test.modele_cable ON cable.id_modele_cable=modele_cable.id_modele_cable
LEFT JOIN test.type_cable ON type_cable.id_type_cable=modele_cable.id_type_cable;
我没有找到任何关于如何做我想做的事情的信息,也没有找到任何可能的信息,如果没有,那么可能是一种解决方法。我试图制作一个触发器来检测PostGIS中视图中的修改,并更新表格' cable'相应地,但我没有设法这样做(我成功只在一次之前在另一个环境中创建了一个触发器,而且非常痛苦)。我还注意到,无法在视图表内手动更新视图(这听起来很合理,因为它是一个视图)。
有没有人有任何线索,方向,帮助和经验可以帮助我解决这个问题?
UPDATE 这是我试图实现它的触发器:
create or replace function tout.update_cable_view() returns trigger as
$body$
begin
select modele_cable.id_modele_cable
into cable.id_modele_cable
from test.cable
inner join test.modele_cable on cable.id_modele_cable=modele_cable.id_modele_cable
inner join test.type_cable on modele_cable.id_type_cable=type_cable.id_type_cable,
public.cable_ok
where cable_ok.nb_fo=type_cable.nb_fo;
return null;
end;
$body$
language plpgsql;
create trigger t_update_cable_view
instead of insert or update on public.cable_ok
for each row
execute procedure tout.update_cable_view();
UPDATE 2 这是一个应该有效的触发函数,但不是:
create or replace function tout.update_cable_view() returns trigger as
$body$
begin
update test.cable
set id_modele_cable = (select id_modele_cable from test.modele_cable
inner join test.type_cable on
modele_cable.id_type_cable=type_cable.id_type_cable
where new.nb_fo=type_cable.nb_fo and old.id_cable=new.id_cable);
return new;
end;
$body$
language plpgsql;
答案 0 :(得分:0)
我找到了另一种使用规则做我想要的方法。我的猜测是PostgreSQL不允许保存视图。使用INSTEAD
规则时,它不会尝试保存视图,而是更新原始表,然后自动更新视图。这是一段代码,用于更新:
create rule "_test_rule" as
on update to public.cable_ok
do instead update test.cable
set id_modele_cable = (select id_modele_cable from test.modele_cable
inner join test.type_cable on modele_cable.id_type_cable=type_cable.id_type_cable
where new.nb_fo=type_cable.nb_fo and new.id_cable=cable.id_cable)
where old.id_cable=cable.id_cable;