CREATE TRIGGER查询时出现语法错误

时间:2014-05-29 14:18:24

标签: postgresql triggers syntax-error

我有这段代码,为我的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""或其附近说"语法错误

1 个答案:

答案 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...