我有此代码,以在我的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”处或附近的语法错误”
最佳答案
让我们简化一下。首先,两个模式。
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();
现在,如果我们更新 View ,我们希望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
So it looks like the problem is in the UPDATE statement of your function.
UPDATE vvs.tb_company SET city = "LAL"
WHERE cardpresso.cardinfo.tb_company_city = vvs.tb_company.city;
我不确定您打算该语句做什么,但是在PostgreSQL中它是无效的,不管“LAL”是列名还是字符串文字。作为字符串文字“LAL”,它将引发错误。
错误:缺少表“cardinfo”的FROM子句条目
第2行:在哪里cardpresso.cardinfo.tb_company_city = vvs.tb_compa ...
关于postgresql - CREATE TRIGGER查询时的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23935571/