gpt4 book ai didi

postgresql - 在 hsqldb 上运行触发的 postgresql 函数

转载 作者:行者123 更新时间:2023-11-29 13:16:13 26 4
gpt4 key购买 nike

我找不到关于转移我的函数的解决方案。

让我们管理 postgresql 上的工作函数和触发器,如下所示:

CREATE FUNCTION func_check_minutes() RETURNS trigger AS
$$
BEGIN
IF (SELECT minutes + NEW.minutes FROM employees WHERE date = NEW.date) > 50
THEN RETURN NULL;
END IF;

RETURN NEW;

END;
$$
LANGUAGE 'plpgsql';

CREATE TRIGGER tr_check_minutes
BEFORE INSERT ON employees
FOR EACH ROW
EXECUTE PROCEDURE func_check_minutes();

甚至可以在 hslqdb 上运行这个函数吗?

因为当我尝试运行它时(显然没有语言命令)出现错误:

DatabaseException: unexpected token: TRIGGER

我有语法错误,所以我不知道这是否可行。我正在从文档中阅读有关 hsqldb 中的函数和触发器的信息,但没有注意到有关 hsqldb 中触发函数的任何示例。

在@fredt 的帮助下,我创建了查询:

<sql dbms="hsqldb">
DROP TRIGGER IF EXISTS tr_check_minutes
CREATE TRIGGER tr_check_minutes
BEFORE INSERT ON hours_worked
FOR EACH ROW
BEGIN ATOMIC
IF (SELECT sum(minutes) + NEW.minutes FROM hours_worked WHERE date = NEW.date) > 1440
THEN RETURN NULL;
END IF;
RETURN NEW;
END
</sql>

但是它打印出一个错误: 用户缺少权限或找不到对象:NEW.DATE

最佳答案

如果您希望 INSERT 在工作时间过长时失败,您可以抛出异常:

CREATE TRIGGER tr_check_minutes
BEFORE INSERT ON hours_worked
REFERENCING NEW ROW AS NEW
FOR EACH ROW
BEGIN ATOMIC
IF (SELECT sum(minutes) + NEW.minutes FROM hours_worked WHERE date = NEW.date) > 1440
THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'too many hours';
END IF;
END

关于postgresql - 在 hsqldb 上运行触发的 postgresql 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48566422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com