触发器错误(创建触发器)
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 TRIGGER
和CREATE 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;触发器之外的语句。只需尝试在控制台中运行它们,以确保触发器主体的语法正确。以上是关于触发器错误(创建触发器)的主要内容,如果未能解决你的问题,请参考以下文章