在hsqldb上运行触发的postgresql函数

在hsqldb上运行触发的postgresql函数,postgresql,function,triggers,hsqldb,Postgresql,Function,Triggers,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;

我找不到转移我的职能的解决办法

让我们管理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:意外标记:触发器

我有语法错误,所以我不知道这是否可能。我从文档中阅读了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

如果希望在工作时间过长时插入失败,可以引发异常:

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

这是可能的。对于这样的简单触发器,不需要单独的函数。语法在这里讨论。我更新了我的问题。谢谢帮助!您的解决方案看起来是可行的,但出现了一个错误:意外的语句结尾:required:;:行:7,但我有;在特定的行信号SQLSTATE'45000'处设置MESSAGE_TEXT='too many hours';您正在使用一个工具来执行SQL,当SQL到达第一个分号时,该工具正在剪切SQL。您是对的,我只是需要更改end delimeter。感谢您的时间和努力!: