Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Mailing Lists -> Oracle-L -> Re: Do triggers cause a context switch between SQL & PL/SQL
Don't worry about the fact that it is inefficient, worry about the fact that it simply doesn't work
Person 2 inserts a row into table ''ApplicationFormCriteria'' but doesn't commit. The 'pseudo-RI' trigger fires and finds the parent row in 'ApplicationForm' so the row is deemed okay.
Person 1 deletes the parent row from "ApplicationForm" - the 'pseudo-RI' trigger fires - and doesn't see the uncommitted row from the other session (that's the joy of Oracle - massive lack of interference on uncommitted data - your programmer may have a Sybase/MSSQL background) so the row deletes okay.
Person 1 commits.
Person 2 commits.
Whoopsie.
Regards
Jonathan Lewis
http://www.jlcomp.demon.co.uk
The educated person is not the person
who can answer the questions, but the
person who can question the answers -- T. Schick Jr
One-day tutorials:
http://www.jlcomp.demon.co.uk/tutorial.html
____UK_______April 8th ____UK_______April 22nd ____Denmark__May 21-23rd ____USA_(FL)_May 2nd
Three-day seminar:
see http://www.jlcomp.demon.co.uk/seminar.html
____UK_(Manchester)_May ____Estonia___June (provisional) ____USA_(CA, TX)_August
The Co-operative Oracle Users' FAQ
http://www.jlcomp.demon.co.uk/faq/ind_faq.html
> Question:
>
> If some idiot decides to circumvent Oracle's referential integrity
and
> re-implement it by using triggers (insert, update, delete) that
checks the
> foreign (parent/child) key fields in other tables like this,
>
> declare numrows INTEGER;
> begin
> -- ApplicationForm is used if the state and other criteria match
that
> in
> -- ApplicationFormCriteria ON PARENT DELETE RESTRICT
> select count(*) into numrows
> from ApplicationFormCriteria
> where
> ApplicationFormCriteria.applicationFormId =
:old.applicationFormId;
> if (numrows > 0)
> then
> raise_application_error(
> -20343,
> 'Database Integrity Violation - Cannot DELETE row in Table
> ''ApplicationForm'' because referencing row exists in table
> ''ApplicationFormCriteria'' for Primary Key (applicationFormId)=' ||
> :old.applicationFormId
> );
> end if;
>
>
> end;
>
> would it cause context switching between the SQL & PL/SQL engines?
>
> Yes, some genius did this in one of our databases. Two hundred
> third/fourth normal form tables enforced by 800 triggers... I have
him
> registered to be stoned in public.
>
-- Please see the official ORACLE-L FAQ: http://www.orafaq.net -- Author: Jonathan Lewis INET: jonathan_at_jlcomp.demon.co.uk Fat City Network Services -- 858-538-5051 http://www.fatcity.com San Diego, California -- Mailing list and web hosting services --------------------------------------------------------------------- To REMOVE yourself from this mailing list, send an E-Mail message to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-L (or the name of mailing list you want to be removed from). You may also send the HELP command for other information (like subscribing).Received on Fri Apr 04 2003 - 13:23:40 CST