したがって、あなたは、INSERT/UPDATE AFTERこの制約、またはelseステートメント・レベルを強化するために、第2のテーブルが関与する必要があります引き金。
を、それははっきりしていない場合2番目のテーブルの目的は、制約をFOREIGN KEY
という制約として適用できることです。 2番目のテーブルのUNIQUE
またはPRIMARY KEY
の制約により、B
の各値が1回だけ表示されます。
ここは、そのアプローチのためのサンプルコードです:
--DROP TABLE table1_parent;
--DROP TABLE table1;
CREATE TABLE table1_parent
(b number NOT NULL,
c number NOT NULL,
constraint table1_parent_pk PRIMARY KEY (b),
constraint table1_parent_u1 UNIQUE (b, c));
CREATE TABLE table1
(
a NUMBER NOT NULL,
b NUMBER NOT NULL,
c NUMBER NOT NULL,
d NUMBER NOT NULL,
e NUMBER NOT NULL,
CONSTRAINT table1_pk PRIMARY KEY (a), -- "A is the primary key."
CONSTRAINT table1_fk FOREIGN KEY (b, c) REFERENCES table1_parent (b, c), -- "For a B there can only be one C, ie: 1-1 ; 2-1 ; 3-2 but not 1-2."
CONSTRAINT table1_u2 UNIQUE (b, c, d) -- "B-C and D can take any value bue can not be repeated, ie: 1-1 1 ; 1-1 2 ; not 1-1 1 again."
);
CREATE INDEX table1_n1 ON table1 (b,c); -- Always index foreign keys
CREATE OR REPLACE VIEW table1_dml_v AS SELECT * FROM table1;
CREATE OR REPLACE TRIGGER table1_dml_v_trg INSTEAD OF INSERT OR UPDATE OR DELETE ON table1_dml_v
DECLARE
l_cnt NUMBER;
BEGIN
IF INSERTING THEN
BEGIN
INSERT INTO table1_parent (b, c) VALUES (:new.b, :new.c);
EXCEPTION
WHEN dup_val_on_index THEN
NULL; -- parent already exists, no problem
END;
INSERT INTO table1 (a, b, c, d, e) VALUES (:new.a, :new.b, :new.c, :new.d, :new.e);
END IF;
IF DELETING THEN
DELETE FROM table1 WHERE a = :old.a;
SELECT COUNT(*) INTO l_cnt FROM table1 WHERE b = :old.b AND c = :old.c;
IF l_cnt = 0 THEN
DELETE FROM table1_parent WHERE b = :old.b AND c = :old.c;
END IF;
END IF;
IF UPDATING THEN
BEGIN
INSERT INTO table1_parent (b, c) VALUES (:new.b, :new.c);
EXCEPTION
WHEN dup_val_on_index THEN
NULL; -- parent already exists, no problem
END;
UPDATE table1 SET a = :new.a, b = :new.b, c = :new.c, d = :new.d, e = :new.d WHERE a = :old.a;
SELECT COUNT(*) INTO l_cnt FROM table1 WHERE b = :old.b AND c = :old.c;
IF l_cnt = 0 THEN
DELETE FROM table1_parent WHERE b = :old.b AND c = :old.c;
END IF;
END IF;
END;
insert into table1_dml_v (a,b,c,d,e) VALUES (1,1,1,1,1);
insert into table1_dml_v (a,b,c,d,e) VALUES (2,1,2,1,1);
insert into table1_dml_v (a,b,c,d,e) VALUES (3,1,1,2,1);
insert into table1_dml_v (a,b,c,d,e) VALUES (4,1,1,2,1);
insert into table1_dml_v (a,b,c,d,e) VALUES (5,2,1,1,1);
は、あなたの代わりにトリガーを検討したことがありますか? –
構造が正規化されていないように聞こえます。 – DCookie
@JuanCarlosOropezaはい、この場合は使用しないことをお勧めします。 – NachoB