【发布时间】:2017-03-29 11:29:11
【问题描述】:
我有一个实体关系模型,我试图在其中遵守规范化规则。但是为了通过 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 视图中的修改,并相应地更新表“电缆”,但我没有设法这样做(我之前只在另一个上下文中成功创建过一次触发器,而且相当痛苦地)。我还注意到无法在视图表中手动更新视图(这听起来很合乎逻辑,因为它是一个视图)。
有没有人有任何线索、方向、帮助、经验可以帮助我解决这个问题?
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;
【问题讨论】:
-
我不确定你想要什么。 updatable view?如果是这样,您尝试为其编写
INSTEAD OF触发器,但失败了?请添加更多上下文和您失败的尝试。 -
我希望当我在 QGIS 的视图层中更新一些信息时,或者当我在 QGIS 的视图中创建一个新元组或删除一个元组时,表 'cable' 会相应地更新。我编辑了我的原始帖子,但尝试实施的触发器失败。我想一个大问题是触发器函数中没有“新”变量......
-
NEW“行”也在INSTEAD OF触发器中定义。此外,您可能想要RETURN NEW(instead ofNULL--INSTEAD OF触发器可以返回 null 以表示它们没有执行任何更新,并且应该跳过该行的其余操作 i>) -- 你真的应该不SELECT从正在插入/更新的视图中。 -
你的可更新视图必须做的是:从
modele_cable->type_cable.nb_fo字段中查找和修复id_modele_cableFK,给定新视图元组中的nb_fo。这可能很难,因为可能有多个modele_cable行指向同一个type_cable元组。 -
@pozs 对不起,我不能说我明白该怎么做。在我让我的函数返回新之前,它也没有工作。无论如何,我在
INTO声明中收到一个错误,说我不能放置cable.id_modele_cable。你有没有像我一样面对过这种需求?如果是的话,你能给我举个例子吗?我仍在努力解决这个触发问题。
标签: postgresql postgis qgis