【问题标题】:Trigger error (create trigger)触发器错误(创建触发器)
【发布时间】:2017-08-08 23:55:23
【问题描述】:

我遇到了错误:

错误:“触发器”处或附近的语法错误 第 18 行:创建或替换触发器 T1
错误:“触发器”处或附近的语法错误 SQL 状态:42601 字符:391

对于此代码:

CREATE OR REPLACE FUNCTION trigf1() RETURNS trigger AS
$$
BEGIN
IF EXISTS ( SELECT*
        FROM Receipt JOIN Sells ON Receipt.license = Sells.license
        WHERE iname = NEW.iname AND cid = NEW.cid AND rno = NEW.rno
    )THEN
    RETURN NEW; 
ELSE
    RAISE NOTICE 'This cafe does not sell the item: %s',new.iname;
    RETURN NULL;
END IF;
END;
$$
LANGUAGE 'plpgsql';
CREATE OR REPLACE TRIGGER T1  
BEFORE INSERT OR UPDATE  
ON Buys
FOR EACH ROW
EXECUTE PROCEDURE trigf1();

知道是什么问题吗?

【问题讨论】:

  • CREATE TRIGGER 行中删除OR REPLACE
  • 我从CREATE TRIGGERCREATE FUNCTION 中删除了OR REPLACE,但仍然出现错误。
  • @ShiraAsulin 如果您仍然遇到错误,请粘贴新的错误消息 - 第二个命令中的语法无效,删除“OR REPLACE”部分后它应该可以工作

标签: sql postgresql triggers


【解决方案1】:

我将底部回调更改为基于 cmets 的过程。我注意到select和*之间没有空格。

CREATE OR REPLACE FUNCTION trigf1() RETURNS trigger AS
$$
BEGIN
IF EXISTS ( SELECT * -- added a space after the select
        FROM Receipt JOIN Sells ON Receipt.license = Sells.license
        WHERE iname = NEW.iname AND cid = NEW.cid AND rno = NEW.rno
    )THEN
    RETURN NEW; 
ELSE
    RAISE NOTICE 'This cafe does not sell the item: %s',new.iname;
    RETURN NULL;
END IF;
END;
$$
LANGUAGE 'plpgsql';
CREATE OR REPLACE TRIGGER T1  
BEFORE INSERT OR UPDATE  
ON Buys
FOR EACH ROW
EXECUTE PROCEDURE trigf1();

【讨论】:

  • 我已更改为功能,但仍然出现错误。
  • 唯一允许的触发器语法是EXECUTE PROCEDURE——在PostgreSQL中函数和过程没有区别。
  • @ShiraAsulin 如果 tis 不起作用,请尝试运行 begin ... end;触发器之外的语句。只需尝试在控制台中运行它们,以确保触发器主体的语法正确。
猜你喜欢
  • 2011-09-11
  • 2013-07-16
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
相关资源
最近更新 更多