Hvordan lage en begrensning Deferrable i Oracle
Begrensninger er utformet for å forebygge ulykker i databehandling og for å bevare integriteten til data. I enkelte tilfeller kan det imidlertid være nødvendig å utsette begrensninger slik at de ikke faktisk håndheve deres regler til en spesifikk betingelse er oppfylt. For eksempel er det mulig å utsette reglene for en begrensning for å aktivere bare når "commit" har blitt forespurt.
Bruksanvisning
1 Lag to tabeller i sqlplus å demonstrere deferrable begrensninger som følger:
CREATE TABLE test (
test_id INTEGER PRIMARY KEY,
foreign_id INTEGER NOT NULL);
CREATE TABLE test2 (
test2_id INTEGER PRIMARY KEY,
foreign2_id INTEGER NOT NULL
);
2 Alter tabellene i sqlplus å legge fremmednøkkelbegrensninger til hverandre som følger:
ALTER TABLE test LEGG CONSTRAINT test2REF
FOREIGN KEY (foreign_ID) REFERANSER test2 (test2_ID)
INITIALLY UTSATT DEFERRABLE;
ALTER TABLE test2 LEGG CONSTRAINT testREF
FOREIGN KEY (foreign2_ID) Referanser test (test_ID)
INITIALLY UTSATT DEFERRABLE;
3 Sett poster i begge tabellene i sqlplus. Dette viser at med en deferrable begrensning, kan rader legges til tross for de utenlandske viktige begrensninger:
INSERT INTO testverdier (1, 2);
INSERT INTO test2 VALUES (2, 1);
4 Forplikte informasjonen på sqlplus kommandoen med:
Begå;
Dette vil fullføre operasjonen og rader vil bli lagt inn i begge tabellene.
5 Demonstrere hvordan det ville mislykkes ved å kjøre alle kommandoene på nytt i én operasjon, men uten utsatt begrensningen. På sqlplus kommandoen skriv:
- Først slette tabellene.
Drop table test CASCADE begrensninger;
Drop bord test2 CASCADE begrensninger;
- Nå skriver alle tidligere kommandoer, men uten de deferrable begrensninger som følger:
CREATE TABLE test (
test_id INTEGER PRIMARY KEY,
foreign_id INTEGER NOT NULL
);
CREATE TABLE test2 (
test2_id INTEGER PRIMARY KEY,
foreign2_id INTEGER NOT NULL
);
ALTER TABLE test LEGG CONSTRAINT test2REF
FOREIGN KEY (foreign_id) REFERANSER test2 (test2_id);
ALTER TABLE test2 LEGG CONSTRAINT testREF
FOREIGN KEY (foreign2_id) Referanser test (test_id);
INSERT INTO testverdier (1, 2);
INSERT INTO test2 VALUES (2, 1);
Denne versjonen av skriptet vil mislykkes som begrensningene ikke har blitt utsatt avventer en "COMMIT" -kommandoen.
Hint
- Kommandoer med "-" før dem er kommentarer i koden.