我有这段代码,为我的postgresql数据库中的View添加触发器
CREATE OR REPLACE FUNCTION changeCityProc() RETURNS TRIGGER AS $changeCity$
BEGIN
UPDATE vvs.tb_company SET city = "LAL" WHERE cardpresso.cardinfo.tb_company_city = vvs.tb_company.city;
RETURN null;
END;
$changeCity$ LANGUAGE plpgsql;
CREATE TRIGGER mytrigger
INSTEAD OF UPDATE ON
cardpresso.cardinfo FOR EACH ROW EXECUTE PROCEDURE changeCityProc();
pgAdmin在" INSTEAD""或其附近说"语法错误
答案 0 :(得分:1)
让我们简化一下。首先,两个架构。
CREATE SCHEMA cardpresso;
CREATE SCHEMA vvs;
接下来,最简单的表格。
CREATE TABLE vvs.tb_company
(
city character varying(25)
);
INSERT INTO vvs.tb_company VALUES ('foo');
一个相当无用的观点。
CREATE VIEW cardpresso.cardinfo AS
SELECT 'test' as tb_company_city UNION ALL
SELECT 'Orem' UNION ALL
SELECT 'Wibble'
;
简化功能。 警告:这会破坏性地更新表格。如果您将此功能中的内容复制到生产中,请务必小心。
CREATE OR REPLACE FUNCTION changecityproc()
RETURNS trigger AS
$BODY$
BEGIN
UPDATE vvs.tb_company SET city = 'bar';
RETURN null;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
最后,触发器。
CREATE TRIGGER mytrigger
INSTEAD OF UPDATE
ON cardpresso.cardinfo
FOR EACH ROW
EXECUTE PROCEDURE changecityproc();
现在,如果我们更新视图,我们希望vvs.tb_company中的所有行都更改为“bar”。
select * from vvs.tb_company;
city -- foo
update cardpresso.cardinfo
set tb_company_city = 'wibble';
select * from vvs.tb_company;
city -- bar
所以看起来就像你的函数的UPDATE语句中的问题一样。
UPDATE vvs.tb_company SET city = "LAL"
WHERE cardpresso.cardinfo.tb_company_city = vvs.tb_company.city;
我不确定你打算做什么,但它在PostgreSQL中无效,无论“LAL”应该是列名还是字符串文字。作为字符串文字'LAL',它会引发错误。
ERROR: missing FROM-clause entry for table "cardinfo" LINE 2: WHERE cardpresso.cardinfo.tb_company_city = vvs.tb_compa...