运行 在 hsqldb 上触发了 postgresql 函数

Run triggered postgresql function on hsqldb

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

让我们在 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