begränsningar är utformade för att förebygga olyckor inom datahantering och att bevara integriteten av data . I vissa fall kan det emellertid vara nödvändigt att skjuta upp begränsningar så att de egentligen inte genomdriva sina regler tills ett visst villkor är uppfyllt . Till exempel är det möjligt att skjuta upp reglerna för en begränsning att aktiveras endast när en " commit " har begärts . Instruktioner
1
Skapa två tabeller i SQLPlus att demonstrera deferrable begränsningar som följer:
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 tabellerna i SQLPlus att lägga främmande nycklar till varandra enligt följande :
ALTER TABLE testet lägga hinder test2REF
främmande nyckel ( foreign_ID ) REFERENSER test2 ( test2_ID )
FÖRST UPPSKJUTEN deferrable ,
ALTER TABLE test2 ADD CONSTRAINT testREF
främmande nyckel ( foreign2_ID ) REFERENSER test ( test_ID ) katalog
FÖRST UPPSKJUTEN deferrable ;
3
infoga poster i båda tabellerna i SQLPlus . Detta visar att med en deferrable tvång , kan rader läggas trots de främmande nycklar :
INSERT INTO testvärden ( 1 , 2 ) ;
INSERT INTO test2 VALUES ( 2 , 1 ) ;
4
begå informationen på SQLPlus kommandot med :
Commit;
Detta kommer att slutföra åtgärden och rader kommer att läggas in i båda tabellerna
5
Demonstrera hur det skulle misslyckas med att köra alla kommandon igen i en enda operation , men utan den uppskjutna tvång . Vid SQLPlus kommandot anger :
- första droppen tabellerna
DROP TABLE testa CASCADE begränsningar,
Drop table test2 CASCADE begränsningar,
- . - nu ange alla tidigare kommandon men utan deferrable begränsningar som följer :
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 tABELL testet lägga hinder test2REF
främmande nyckel ( foreign_id ) REFERENSER test2 ( test2_id ) ;
ALTER TABLE test2 ADD CONSTRAINT testREF
främmande nyckel ( foreign2_id ) REFERENSER test ( test_id ) ;
INSERT INTO testvärden ( 1 , 2 ) ;
INSERT INTO test2 VALUES ( 2 , 1 ) ,
Denna version av manuset kommer att misslyckas eftersom de begränsningar har inte skjutits väntar ett " COMMIT " kommandot .