U kunt dit doen met behulp van gecontroleerde redundantie en samengestelde FK-beperkingen:
CREATE TABLE offr (
offr_id INT NOT NULL,
coy_id INT NOT NULL,
PRIMARY KEY (offr_id),
FOREIGN KEY (coy_id) REFERENCES ins_coy (coy_id),
UNIQUE KEY (offr_id, coy_id)
);
Ik heb een samengestelde unieke sleutel (offr_id, coy_id) toegevoegd om een samengestelde FK-beperking op de subscribe
te ondersteunen tafel.
CREATE TABLE provide (
coy_id INT NOT NULL,
type_id INT NOT NULL,
PRIMARY KEY (coy_id, type_id),
FOREIGN KEY (coy_id) REFERENCES ins_coy (coy_id)
);
De samengestelde primaire sleutel hier is perfect voor een samengestelde FK-beperking op de subscribe
tafel.
CREATE TABLE subscribe (
naf_no INT NOT NULL,
coy_id INT NOT NULL,
type_id INT NOT NULL,
PRIMARY KEY (naf_no, type_id),
FOREIGN KEY (naf_no, coy_id) REFERENCES offr (offr_id, coy_id),
FOREIGN KEY (coy_id, type_id) REFERENCES provide (coy_id, type_id)
);
Overlappende samengestelde FK-beperkingen zorgen ervoor dat een functionaris zich alleen kan abonneren op een verzekering die wordt aangeboden door het bedrijf waarbij hij/zij is ingeschreven. coy_id
is logisch redundant maar vereist voor integriteit en er is geen risico op update-afwijkingen vanwege de FK-beperkingen.
Als alternatief kunt u triggers gebruiken om te controleren of de waarden gerelateerd zijn via inner joins:
CREATE TRIGGER check_subscribe BEFORE INSERT OR UPDATE ON subscribe
FOR EACH ROW
WHEN NOT EXISTS (
SELECT 1
FROM offr
INNER JOIN provide ON offr.coy_id = provide.coy_id
WHERE offr.offr_id = new.naf_no AND provide.type_id = new.type_id
)
RAISE_APPLICATION_ERROR (num => -20000, msg => 'Officers can only subscribe to types provided by their company');
Disclaimer:ik heb dit niet kunnen testen op SqlFiddle en heb Oracle niet geïnstalleerd, maar hopelijk wijst het je in de goede richting.