将变量声明为 ROWTYPE - 触发函数
Declare a variable as a ROWTYPE - Trigger function
这个问题,我创建了一个table叫groups(id, name, group_id INTEGER NULLABLE,class_id INTEGER NULLABLE),逻辑是class 化组之间的数据,classes 和 subclasses。一个组有很多class,一个class有很多子class。我想在 plpgsql 中创建一个触发器函数,以保证在插入或更新数据之前的某些条件。
class验证数据的条件如下。
群组:
用户只需插入 name 值。
group_id 和 clazz_id 必须是 NULL 值。
Classes:
用户只需插入 name 和 group_id 值。
group_id 必须是一个 INTEGER NOT NULL 值并且 clazz_id 是一个 NULL 值。
group_id 必须满足条件才能 class 成为一个团体。
子class是:
用户只需插入 name、group_id 和 clazz_id值。因此,您可以将 group_id 值设置为等于 group_id 属于 clazz_id 用于保证条件为真。
group_id 必须与 class_id[=61= 相同 group_id ] 设置。
clazz_id 必须满足 class 成为 Class 的条件。
.
CREATE FUNCTION emp_subclasse() RETURNS trigger AS $subclasse_verification$
DECLARE
group groups%ROWTYPE;
classe groups%ROWTYPE;
class_group groups%ROWTYPE;
BEGIN
group =(SELECT * FROM groups WHERE id=NEW.group_id);
classe =(SELECT * FROM groups WHERE id=NEW.clazz_id);
class_group =(SELECT * FROM groups WHERE id=classe.group_id);
IF NEW.clazz_id IS NOT NULL THEN
IF (classe.group_id) IS NULL THEN
RAISE EXCEPTION 'A CLASS MUST POINT TO A GROUP';
ELSIF classe.group_id IS NOT NULL THEN
NEW.group_id = classe.group_id;
IF class_group.group_id IS NOT NULL OR class_group.clazz_id IS NOT NULL THEN
RAISE EXCEPTION 'A GROUP CANNOT HAVE A GROUP_ID OR CLASS_ID POINTED';
END IF;
END IF;
IF classe.clazz_id IS NOT NULL THEN
RAISE EXCEPTION 'CANNOT CLASSIFY A CLASS AS A SUBCLASS';
END IF;
ELSIF NEW.clazz_id IS NULL THEN
IF NEW.group_id IS NOT NULL THEN
IF group.group_id IS NOT NULL OR grupo.clazz_id IS NOT NULL THEN
RAISE EXCEPTION 'A GROUP CANNOT HAVE A GROUP_ID OR CLASS_ID POINTED';
END IF;
END IF;
END IF;
END;
$subclasse_verification$ LANGUAGE 'plpgsql';
CREATE TRIGGER subclasse_verification BEFORE INSERT OR UPDATE ON groups
FOR EACH ROW EXECUTE PROCEDURE emp_subclasse();
但是,当我尝试插入值时,出现错误 [2018-11-20 16:35:20] [42601] ERROR: subquery must return only one column
[2018-11-20 16:35:20] WHERE: PL/pgSQL function emp_subclasse() line 7 at assignment
group =(SELECT * FROM groups WHERE id=NEW.group_id);
classe =(SELECT * FROM groups WHERE id=NEW.clazz_id);
class_group =(SELECT * FROM groups WHERE id=classe.group_id);
这些子查询返回所有列 (SELECT *)。要正确填充变量,select 行而不扩展:group := (SELECT groups FROM groups WHERE ...)
或执行 SELECT INTO:SELECT * INTO group FROM groups WHERE ...
这个问题,我创建了一个table叫groups(id, name, group_id INTEGER NULLABLE,class_id INTEGER NULLABLE),逻辑是class 化组之间的数据,classes 和 subclasses。一个组有很多class,一个class有很多子class。我想在 plpgsql 中创建一个触发器函数,以保证在插入或更新数据之前的某些条件。
class验证数据的条件如下。
群组:
用户只需插入 name 值。
group_id 和 clazz_id 必须是 NULL 值。Classes:
用户只需插入 name 和 group_id 值。
group_id 必须是一个 INTEGER NOT NULL 值并且 clazz_id 是一个 NULL 值。
group_id 必须满足条件才能 class 成为一个团体。子class是:
用户只需插入 name、group_id 和 clazz_id值。因此,您可以将 group_id 值设置为等于 group_id 属于 clazz_id 用于保证条件为真。
group_id 必须与 class_id[=61= 相同 group_id ] 设置。
clazz_id 必须满足 class 成为 Class 的条件。
.
CREATE FUNCTION emp_subclasse() RETURNS trigger AS $subclasse_verification$
DECLARE
group groups%ROWTYPE;
classe groups%ROWTYPE;
class_group groups%ROWTYPE;
BEGIN
group =(SELECT * FROM groups WHERE id=NEW.group_id);
classe =(SELECT * FROM groups WHERE id=NEW.clazz_id);
class_group =(SELECT * FROM groups WHERE id=classe.group_id);
IF NEW.clazz_id IS NOT NULL THEN
IF (classe.group_id) IS NULL THEN
RAISE EXCEPTION 'A CLASS MUST POINT TO A GROUP';
ELSIF classe.group_id IS NOT NULL THEN
NEW.group_id = classe.group_id;
IF class_group.group_id IS NOT NULL OR class_group.clazz_id IS NOT NULL THEN
RAISE EXCEPTION 'A GROUP CANNOT HAVE A GROUP_ID OR CLASS_ID POINTED';
END IF;
END IF;
IF classe.clazz_id IS NOT NULL THEN
RAISE EXCEPTION 'CANNOT CLASSIFY A CLASS AS A SUBCLASS';
END IF;
ELSIF NEW.clazz_id IS NULL THEN
IF NEW.group_id IS NOT NULL THEN
IF group.group_id IS NOT NULL OR grupo.clazz_id IS NOT NULL THEN
RAISE EXCEPTION 'A GROUP CANNOT HAVE A GROUP_ID OR CLASS_ID POINTED';
END IF;
END IF;
END IF;
END;
$subclasse_verification$ LANGUAGE 'plpgsql';
CREATE TRIGGER subclasse_verification BEFORE INSERT OR UPDATE ON groups
FOR EACH ROW EXECUTE PROCEDURE emp_subclasse();
但是,当我尝试插入值时,出现错误 [2018-11-20 16:35:20] [42601] ERROR: subquery must return only one column
[2018-11-20 16:35:20] WHERE: PL/pgSQL function emp_subclasse() line 7 at assignment
group =(SELECT * FROM groups WHERE id=NEW.group_id);
classe =(SELECT * FROM groups WHERE id=NEW.clazz_id);
class_group =(SELECT * FROM groups WHERE id=classe.group_id);
这些子查询返回所有列 (SELECT *)。要正确填充变量,select 行而不扩展:group := (SELECT groups FROM groups WHERE ...)
或执行 SELECT INTO:SELECT * INTO group FROM groups WHERE ...