触发器错误(创建触发器)

Posted

技术标签:

【中文标题】触发器错误(创建触发器)【英文标题】: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 ***.com/questions/35927365/… 我从CREATE TRIGGERCREATE FUNCTION 中删除了OR REPLACE,但仍然出现错误。 @ShiraAsulin 如果您仍然遇到错误,请粘贴新的错误消息 - 第二个命令中的语法无效,删除“OR REPLACE”部分后它应该可以工作 【参考方案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;触发器之外的语句。只需尝试在控制台中运行它们,以确保触发器主体的语法正确。

以上是关于触发器错误(创建触发器)的主要内容,如果未能解决你的问题,请参考以下文章

使用编译错误创建的触发器:

插入触发器操作时创建触发器语法错误

创建触发器 - DECLARE 错误

在具有聚集列存储索引的表上创建触发器 - 错误

错误 DbVisualizer 创建触发器

创建触发器时出现错误 1064