Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment puis-je garantir l'intégrité entre des tables non liées ?

Vous pouvez le faire en utilisant la redondance contrôlée et les contraintes FK composites :

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)
);

J'ai ajouté une clé unique composite (offr_id, coy_id) pour prendre en charge une contrainte FK composite sur le subscribe tableau.

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)
);

La clé primaire composite ici est parfaite pour une contrainte FK composite sur le subscribe tableau.

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)
);

Le chevauchement des contraintes FK composites garantira qu'un agent ne peut souscrire qu'à l'assurance proposée par la société à laquelle il est inscrit. coy_id est logiquement redondant mais requis pour l'intégrité et il n'y a aucun risque d'anomalies de mise à jour en raison des contraintes FK.

Vous pouvez également utiliser des déclencheurs pour vérifier que les valeurs sont liées via des jointures internes :

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');

Avis de non-responsabilité :je n'ai pas pu tester cela sur SqlFiddle et je n'ai pas installé Oracle, mais j'espère que cela vous orientera dans la bonne direction.