Solved

Trigger comparing columns on UPDATE

Posted on 2007-11-15
14
1,527 Views
Last Modified: 2013-12-19
Hi Experts -
I'm trying to write an UPDATE trigger for an Oracle database.  The goal is to check an existing date column to make sure the newly updated column is later.
Here's what I have:

CREATE or REPLACE TRIGGER trigger_name
BEFORE INSERT OR UPDATE date1 ON sometable1
FOR EACH ROW
BEGIN
  IF (_______date2 < _______date1) THEN
        RAISE_APPLICATION_ERROR(-20001, Date2 must be greater than Date1);
    END IF;
END;

When I do an insert with a date2 that is before date1, the trigger is not firing.  I don't know what to put in the underlined fields above (:new., :old, etc.).

Thanks for any insight you can provide.

chezbrgrs
0
Comment
Question by:chezbrgrs
  • 6
  • 4
  • 4
14 Comments
 
LVL 18

Expert Comment

by:Jinesh Kamdar
Comment Utility

CREATE or REPLACE TRIGGER trigger_name

BEFORE INSERT OR UPDATE date1 ON sometable1

FOR EACH ROW

BEGIN

IF (:new.date1 < :old.date1) THEN

   RAISE_APPLICATION_ERROR(-20001, New Date must be greater than Old Date); 

END IF; 

END;

Open in new window

0
 
LVL 12

Expert Comment

by:jwahl
Comment Utility
do you have a NOT NULL constraint on date1?
if not, you have to compare with NVL() or do an additional check.


CREATE or REPLACE TRIGGER trigger_name

BEFORE INSERT OR UPDATE date1 ON sometable1

FOR EACH ROW

BEGIN

  IF :NEW.date1 < :OLD.date1 THEN

     RAISE_APPLICATION_ERROR(-20001, 'New Date must be greater than old Date!');

  END IF;

END;

Open in new window

0
 

Author Comment

by:chezbrgrs
Comment Utility
Sorry, I wasn't clear.  The dates are in two different columns (startdate and enddate).  Wouldn't this solution just be looking at one column?
0
 
LVL 18

Expert Comment

by:Jinesh Kamdar
Comment Utility
Then, you dont need a trigger at all. Just create a CHECK constraint on the table as below : -

ALTER TABLE sometable1 ADD CONSTRAINT someconstraint1 CHECK (start_date <= end_date) ENABLE VALIDATE;

Above would throw error if the existing data in the table does not follow the constraint rule. In that case, u may use the NOVALIDATE option to ignore validation of existing data.
0
 
LVL 12

Expert Comment

by:jwahl
Comment Utility
in this case you also can define a check constraint:





ALTER TABLE my_table ADD 

CONSTRAINT date_test

 CHECK (startdate < enddate) ENABLE

 VALIDATE;

Open in new window

0
 
LVL 12

Expert Comment

by:jwahl
Comment Utility
jinesh_kamdar is always faster ... ;-)
0
 
LVL 18

Expert Comment

by:Jinesh Kamdar
Comment Utility
@jwahl - Guess my TOAD works a bit faster ;-)
0
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 
LVL 12

Expert Comment

by:jwahl
Comment Utility
... i don't think it's only the TOAD  ... ;-)
0
 

Author Comment

by:chezbrgrs
Comment Utility
The CHECK constraint would be much easier but I've been asked to use a TRIGGER and not alter the table.  Can it be done with a TRIGGER?
0
 
LVL 12

Accepted Solution

by:
jwahl earned 500 total points
Comment Utility
sure can it be done with trigger. is it possible to update startdate and enddate at the same time? can you update to NULL? if not, you can use


CREATE or REPLACE TRIGGER trigger_name

BEFORE INSERT OR UPDATE date1 ON sometable1

FOR EACH ROW

BEGIN

  IF :NEW.enddate < :OLD.startdate THEN

     RAISE_APPLICATION_ERROR(-20001, 'Enddate must be greater than Stardate!');

  END IF;

END;

Open in new window

0
 
LVL 18

Expert Comment

by:Jinesh Kamdar
Comment Utility
I think the IF condition should be IF :NEW.enddate < :NEW.startdate THEN
0
 

Author Comment

by:chezbrgrs
Comment Utility
jwahl -

Thanks I'll try this this evening and will let you know the results.  Thanks.

chezbrgrs
0
 
LVL 12

Expert Comment

by:jwahl
Comment Utility
@jinesh_kamdar: you are right when the trigger is inserting then :OLD.startdate is null.

i think he should do different checks depending on insert/update:

...
   IF UPDATING THEN
       ....
   ELSIF INSERTING THEN
       ...
   END IF;
...
0
 

Author Comment

by:chezbrgrs
Comment Utility
The :old value worked because startdate was not NULL.  Thanks for contributing.

chezbrgrs
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Join & Write a Comment

I remember the day when someone asked me to create a user for an application developement. The user should be able to create views and materialized views and, so, I used the following syntax: (CODE) This way, I guessed, I would ensure that use…
How to Unravel a Tricky Query Introduction If you browse through the Oracle zones or any of the other database-related zones you'll come across some complicated solutions and sometimes you'll just have to wonder how anyone came up with them.  …
This video shows setup options and the basic steps and syntax for duplicating (cloning) a database from one instance to another. Examples are given for duplicating to the same machine and to different machines
This videos aims to give the viewer a basic demonstration of how a user can query current session information by using the SYS_CONTEXT function

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

8 Experts available now in Live!

Get 1:1 Help Now