Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1537
  • Last Modified:

Trigger comparing columns on UPDATE

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
chezbrgrs
Asked:
chezbrgrs
  • 6
  • 4
  • 4
1 Solution
 
Jinesh KamdarCommented:

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
 
jwahlCommented:
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
 
chezbrgrsAuthor Commented:
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
Visualize your virtual and backup environments

Create well-organized and polished visualizations of your virtual and backup environments when planning VMware vSphere, Microsoft Hyper-V or Veeam deployments. It helps you to gain better visibility and valuable business insights.

 
Jinesh KamdarCommented:
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
 
jwahlCommented:
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
 
jwahlCommented:
jinesh_kamdar is always faster ... ;-)
0
 
Jinesh KamdarCommented:
@jwahl - Guess my TOAD works a bit faster ;-)
0
 
jwahlCommented:
... i don't think it's only the TOAD  ... ;-)
0
 
chezbrgrsAuthor Commented:
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
 
jwahlCommented:
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
 
Jinesh KamdarCommented:
I think the IF condition should be IF :NEW.enddate < :NEW.startdate THEN
0
 
chezbrgrsAuthor Commented:
jwahl -

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

chezbrgrs
0
 
jwahlCommented:
@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
 
chezbrgrsAuthor Commented:
The :old value worked because startdate was not NULL.  Thanks for contributing.

chezbrgrs
0

Featured Post

Configuration Guide and Best Practices

Read the guide to learn how to orchestrate Data ONTAP, create application-consistent backups and enable fast recovery from NetApp storage snapshots. Version 9.5 also contains performance and scalability enhancements to meet the needs of the largest enterprise environments.

  • 6
  • 4
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now