2017-08-16 62 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不會試圖插入視圖,這將失敗。