postgresql - CREATE TRIGGER查询时的语法错误

标签 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”处或附近的语法错误”

最佳答案

让我们简化一下。首先,两个模式。

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/

相关文章:

syntax-error - 带有 Case 语句和过程声明的 VHDL 中的语法错误

postgresql - PGError : ERROR: operator does not exist: boolean ~~* unknown

postgresql - Postgres 用大写字母转储特定表

Oracle 复合触发器 - 如何存储和 "use"删除的行?索引表?

mysql - 如果第一个表中尚不存在给定值,则 SQL 触发器 : Inserting a row in a table after an insert on another table,

.net - 如何从 SQL 触发器执行 .NET 代码?

java - setOnClickListener 语法错误

javascript - 未捕获错误 : Syntax error, 无法识别的表达式:悬停

postgresql - 如何更改 PostgreSQL 中的默认时间戳格式

django - 如何配置 Postgres 与 pytest 一起使用