sql >> Database teknologi >  >> RDS >> Oracle

Hvordan sikrer jeg integritet mellem ikke-relaterede tabeller?

Du kan gøre det ved at bruge kontrolleret redundans og sammensatte FK-begrænsninger:

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

Jeg tilføjede en sammensat unik nøgle (offr_id, coy_id) for at understøtte en sammensat FK-begrænsning på subscribe tabel.

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

Den sammensatte primærnøgle her er perfekt til en sammensat FK-begrænsning på subscribe tabel.

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 sammensatte FK-begrænsninger vil sikre, at en officer kun kan tegne en forsikring, der tilbydes af det selskab, han/hun er tilmeldt. coy_id er logisk overflødig, men påkrævet for integritet, og der er ingen risiko for opdateringsanomalier på grund af FK-begrænsningerne.

Alternativt kan du bruge triggere til at kontrollere, at værdierne er relateret via indre joinforbindelser:

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

Ansvarsfraskrivelse:Jeg var ikke i stand til at teste dette på SqlFiddle og har ikke Oracle installeret, men forhåbentlig vil det pege dig i den rigtige retning.




  1. Oracle svarende til SQL Server DATEPART

  2. Node.js MySQL har brug for vedvarende forbindelse

  3. 'MSDAORA.1'-udbyderen er ikke registreret på den lokale maskine

  4. Søg i 300 millioner adresser med pg_trgm