Oracle PL SQL触发器 - 使数据保持一致

时间:2013-05-04 09:17:33

标签: sql oracle triggers

ORACLE / PL SQL TRIGGER 我有一个名为unit_tbl的住宅物业表。

主要复合键是(unit_num,complex_num和owner_num),因此许多所有者可以在同一个复合体中拥有相同的单元。

其他栏目包括num_of_bedrooms(即4,3,2,1)和property_type(即住宅,复式,公寓,公寓)。

假设输入了以下声明:

INSERT INTO unit_tbl
  (unit_id, complex_id, owner_id, num_beds, property_type) 
VALUES
  (001, 1000, 010, 3, 'apartment');

我想提出一个错误,以便如果为另一个所有者(属性相同)输入相同的unit_id和complex_id,那么如果num_beds与前一个条目不匹配,或者属性类型与之前的条目不匹配条目。

例如,如果有人要插入或更新以下内容,则会引发错误:

INSERT INTO unit_tbl
   (unit_id, complex_id, owner_id, num_beds, property_type) 
VALUES
  (001, 1000, 011, 2, 'apartment');  -- num_beds here does not match the same property previously entered.

我尝试过创建一个触发器:

CREATE OR REPLACE TRIGGER unit_consist_check
BEFORE INSERT OR UPDATE ON unit_tbl
FOR EACH ROW
DECLARE
BEGIN
IF :NEW.unit_id = :OLD.unit_id AND :NEW.complex_id=:OLD.complex_id AND ( :NEW.num_beds <> :OLD.num_beds OR :NEW.property_type <> :OLD.property_type) THEN
raise_application_error (-20002, 'nconsistent data on bedroom size or property type.  Please make sure this data is identical to previously entered data for this specific unit_id and complex_id');
END IF;
END;
/

我也尝试过DECLARING变量并执行SELECT INTO变量,但这似乎给出了一个关于获取太多行的错误。

我是PL / SQL的新手,所以非常感谢您的帮助和耐心。

1 个答案:

答案 0 :(得分:3)

你正在使用一种不好的做法 - 触发器 - 来弥补另一种不良做法 - 正规化。

添加一个新表以单独存储该单元,并使用unit_owner表将其连接到所有者表,您将不再需要触发器。