从PostgreSQL / PostGIS

时间:2017-03-29 11:29:12

标签: postgresql postgis qgis

我有一个实体关系模型,我试图尊重规范化规则。但是为了通过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;

1 个答案:

答案 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;