sql >> Databasteknik >  >> RDS >> Oracle

Hur säkerställer jag integritet mellan orelaterade tabeller?

Du kan göra det med kontrollerad redundans och sammansatta FK-begränsningar:

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

Jag lade till en sammansatt unik nyckel (offr_id, coy_id) för att stödja en sammansatt FK-begränsning på subscribe bord.

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 sammansatta primärnyckeln här är perfekt för en sammansatt FK-begränsning på subscribe bord.

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

Överlappande sammansatta FK-begränsningar säkerställer att en tjänsteman endast kan teckna försäkringar som erbjuds av företaget han/hon är inskriven i. coy_id är logiskt överflödig men krävs för integritet och det finns ingen risk för uppdateringsavvikelser på grund av FK-begränsningarna.

Alternativt kan du använda triggers för att kontrollera att värdena är relaterade via inre kopplingar:

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

Ansvarsfriskrivning:Jag kunde inte testa detta på SqlFiddle och har inte Oracle installerat, men förhoppningsvis kommer det att peka dig i rätt riktning.




  1. Är det möjligt att ändra mysql DB-kodningsteckenuppsättning från en laravel-migrering?

  2. CLOB-värde in ut/retur från plsql (ogiltig LOB-locator specificerad:ORA-22275)

  3. MySQL-tidsstämpel till Java-datumkonvertering

  4. Oracle lagrad procedur fråga som att inte arbeta med markören