2017-08-16 104 views
0

我正在将此数据{"curr": "testcurr","nm": "testnm"} 添加到视图中。使用触发功能不能在视图中插入新行

然后运行一个触发器函数来插入原始表中。

我从触发器函数中收到错误cannot insert into column "curr" of view "tblview"

这里是我的代码的一部分:

IF (tg_op = 'INSERT') THEN 
       NEW."dat"= jsonb_build_object("curr",NEW.'curr','symb',NEW."symb"); 
       NEW."ct"=now(); 
       INSERT INTO data.tbl 
        (
        "nm", 
        "dat", 
        "ct", 
        ) 
        VALUES 
        (
        NEW."nm", 
        NEW."dat" 
        NEW."ct" 
        )returning "id" into NEW.id; 
END 

这是我的观点:

CREATE OR REPLACE VIEW data.tblview AS 
SELECT gn.id, 
    gn.nm, 
    ((gn.dat ->> 'curr'::text))::character varying(64) AS curr, 
    ((gn.dat ->> 'symb'::text))::character varying(64) AS symb, 
    gn.ct 
    FROM data.gn 

那么究竟是为什么我不能插入新行的原因是什么?

+0

你不能插入到视图中。视图是RO对象。基本上看,只是一个选择规则。它只会选择 - 没有保存任何数据 –

回答

0

https://www.postgresql.org/docs/current/static/sql-createview.html

视图不是物理物化。相反,每次在查询中引用视图时,都会运行查询 。

所以你不能用

+0

好吧,那么如果我真的想插入原始表中呢?因为我得到相同的错误 –

+0

插入到data.tbl失败,同样的错误?..请相当确切messange在OP –

0

你创建一个BEFORE INSERT触发器定义插入看法?

我相信你应该创建你的触发器为“INSTEAD OF INSERT”,这样postgres不会试图插入视图,这将失败。