运行 在 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
我找不到关于转移我的函数的解决方案。
让我们在 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