从 PostgreSQL/PostGIS 中的视图更新 table 数据

Update table data from view in PostgreSQL/PostGIS

我有一个实体关系模型,我试图在其中遵守规范化规则。但是为了通过 PostGIS 进入 QGIS 并且目前只有相关数据,我想通过一些视图工作,将这些视图显示到 QGIS 中并可能根据视图中所做的修改更新相应的 table .

例如,我有三个 tables,其中电缆是包含我必须使用的数据的那个,modele_cable 一个参考 table(弱实体)包含一些信息将填充视图,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 视图中的修改,并相应地更新 table 'cable',但我没有设法这样做(我只成功地创建了一次触发器之前的另一个上下文,非常痛苦)。我还注意到无法在视图的 table 内手动更新视图(这听起来合乎逻辑,因为它是一个视图)。

有没有人有任何线索、方向、帮助、经验可以帮助我解决这个问题?

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();

更新 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;

我找到了另一种使用规则来完成我想做的事情的方法。我的猜测是 PostgreSQL 不允许保存视图。使用 INSTEAD 规则,它不会尝试保存视图,而是更新原始的 table,然后自动更新视图。这是一段代码,用于更新:

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;