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的新手,所以非常感谢您的帮助和耐心。
答案 0 :(得分:3)
你正在使用一种不好的做法 - 触发器 - 来弥补另一种不良做法 - 正规化。
添加一个新表以单独存储该单元,并使用unit_owner表将其连接到所有者表,您将不再需要触发器。