【问题标题】:PostgreSQL - Creating a trigger: function does not existPostgreSQL - 创建触发器:函数不存在
【发布时间】:2019-12-03 17:45:39
【问题描述】:

我现在正在为学校编写脚本,但遇到了一个无法修复的奇怪错误。 所以我有一个播放列表、曲目和一个播放列表输入表。 我的任务是创建一个触发器,如果​​我在播放列表中添加/删除曲目,则应该增加/减少 amountOfTracks 变量。

现在来看看奇怪的错误: 我制作了一个函数“playlistInputAdd”,它在执行“select playlistInputAdd(1,1)”时已经可以使用。 问题是,如果我创建触发器,它会说这个函数不存在。我看到有人问过同样的问题,但他没有添加参数,而我实际上做了。

playlistInputAdd 函数:

CREATE FUNCTION playlistInputAdd(ID int, Amount int)
RETURNS VOID
AS $$
BEGIN
    UPDATE playlist
    SET amountOfTracks = amountOfTracks + Amount
    WHERE playListID = ID;
END;
$$ LANGUAGE plpgsql;

playlistInputAdd_trigger 触发器:

CREATE TRIGGER playlistInputAdd_trigger 
AFTER INSERT
ON playlistInput 
FOR EACH ROW 
EXECUTE PROCEDURE playlistInputAdd(playlistID, 1);

playlistInputDelete_trigger 触发器:

CREATE TRIGGER playlistInputDelete_trigger 
AFTER INSERT
ON playlistInput 
FOR EACH ROW 
EXECUTE PROCEDURE playlistInputAdd(playlistID, 1);

错误信息:

ERROR: function playlistinputadd() does not exist

提前谢谢你!

【问题讨论】:

  • 触发函数需要声明为returns trigger

标签: sql postgresql triggers database-trigger


【解决方案1】:

必须使用空参数列表和RETURNS trigger 定义触发函数。这是导致您得到错误的参数列表。

可以将参数传递给CREATE TRIGGER 中的函数(即使参数列表必须为空),但这些参数必须是常量并且可以通过函数中的TG_ARGV 访问身体。

您不需要将修改后的表的列作为参数传递:插入的行在触发器主体的NEW 变量中可用。

请参阅the documentation 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多