Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Mailing Lists -> Oracle-L -> Re: Do triggers cause a context switch between SQL & PL/SQL

Re: Do triggers cause a context switch between SQL & PL/SQL

From: Jonathan Lewis <jonathan_at_jlcomp.demon.co.uk>
Date: Fri, 04 Apr 2003 11:23:40 -0800
Message-ID: <F001.0057AB09.20030404112340@fatcity.com>

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

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US