0

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 を初めて使用するので、ご理解とご協力をお願いいたします。

4

1 に答える 1

3

別の悪い慣行である非正規化を補うために、悪い慣行であるトリガーを使用しています。

ユニットを個別に格納する新しいテーブルを追加し、それを unit_owner テーブルを使用して所有者テーブルに結合すると、トリガーは不要になります。

于 2013-05-04T09:31:11.160 に答える