【问题标题】:Update table data from view in PostgreSQL/PostGIS从 PostgreSQL/PostGIS 中的视图更新表数据
【发布时间】: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 NEWinstead of NULL -- INSTEAD OF 触发器可以返回 null 以表示它们没有执行任何更新,并且应该跳过该行的其余操作 i>) -- 你真的应该 SELECT 从正在插入/更新的视图中。
  • 你的可更新视图必须做的是:从modele_cable -> type_cable.nb_fo 字段中查找和修复id_modele_cable FK,给定新视图元组中的nb_fo。这可能很难,因为可能有多个 modele_cable 行指向同一个 type_cable 元组。
  • @pozs 对不起,我不能说我明白该怎么做。在我让我的函数返回新之前,它也没有工作。无论如何,我在INTO 声明中收到一个错误,说我不能放置cable.id_modele_cable。你有没有像我一样面对过这种需求?如果是的话,你能给我举个例子吗?我仍在努力解决这个触发问题。

标签: postgresql postgis qgis


【解决方案1】:

我找到了另一种使用规则做我想做的事的方法。我的猜测是 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多