2013-05-04 50 views
0

ORACLE/PL SQL觸發器 我有一個處理住宅屬性的表,名爲unit_tbl。Oracle PL SQL觸發器 - 使數據一致

主要組合鍵是(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; 
/

我也嘗試宣告

舉例來說,如果有人要插入或更新如下錯誤將引發變量和做一個SELECT INTO變量,但似乎給出了一個關於提取太多行的錯誤。

我是PL/SQL新手,非常感謝您的幫助和耐心。

+0

一個單位怎麼可能有多個所有者 - 你也持有歷史數據嗎?更重要的是,(a)你爲什麼不把這些單位放在一張桌子上,並將所有權放在另一張桌子上,以保證完整性;和(b)如果某人改造一個單位以添加/移除臥室會發生什麼? – 2013-05-04 09:22:31

+0

另外'OLD'和'NEW'指的是當前行,所以你的比較只能在'UPDATE'上工作。那個觸發器發生了什麼 - 錯誤,還是沒有提出異常? – 2013-05-04 09:26:17

+0

嗨亞歷克斯,這種設計是考慮到可能有兩個兄弟誰擁有相同的單位或兄弟和姊妹,可以擁有一個單位...複合鍵考慮到多個owner_id在complex(complex_id)中擁有單個unit_id .... owner的ARE保存在單獨的表中,它們是unit_tbl中的外鍵/複合主鍵的一部分。 – user2349371 2013-05-04 09:29:28

回答

3

您正在使用不良做法 - 觸發器 - 以補償另一個不良做法 - 不規範。

添加一個新表來分別存儲單元並使用unit_owner表將其連接到所有者表,並且不再需要觸發器。

+0

感謝您的幫助! – user2349371 2013-05-04 11:18:05