RDOHELP72.HLB  —  DEFINE_TRIGGER, Examples
    The following example defines a trigger that performs a cascading
    delete triggered by the deletion of an employee record. Such a
    trigger can be used to maintain referential integrity among the
    EMPLOYEES, JOB_HISTORY, RESUMES, and SALARY_HISTORY relations.

    Each associated employee record (from the relations which have
    foreign keys referring to the primary key in the EMPLOYEES
    relation) is deleted.

    RDO> DEFINE TRIGGER EMPLOYEE_ID_CASCADE_DELETE
    cont>        BEFORE ERASE
    cont>        FOR E IN EMPLOYEES
    cont>            EXECUTE
    cont>                FOR D IN DEGREES WITH
    cont>                  D.EMPLOYEE_ID = E.EMPLOYEE_ID
    cont>                  ERASE D
    cont>                END_FOR;
    cont>                FOR JH IN JOB_HISTORY WITH
    cont>                  JH.EMPLOYEE_ID = E.EMPLOYEE_ID
    cont>                  ERASE JH
    cont>                END_FOR;
    cont>                FOR R IN RESUMES WITH
    cont>                  R.EMPLOYEE_ID = E.EMPLOYEE_ID
    cont>                  ERASE R
    cont>                END_FOR;
    cont>                FOR SH IN SALARY_HISTORY WITH
    cont>                  SH.EMPLOYEE_ID = E.EMPLOYEE_ID
    cont>                  ERASE SH
    cont>                END_FOR
    cont>            FOR EACH RECORD.

    The following RDO command procedure example defines a MODIFY
    trigger with two actions. The first action is defined to account
    for the situation where the triggering MODIFY statement has not
    actually changed the value for the pertinent field (EMPLOYEE_
    ID). This trigger causes a cascading update of the EMPLOYEES
    relation's EMPLOYEE_ID value to the JOB_HISTORY table. The WITH
    clause stipulates that the cascading update will occur only when
    the EMPLOYEE_ID value actually changes. The example also logs
    each MODIFY operation to the LOG relation.

    !
    ! Invoke the database:
    INVOKE DATABASE FILENAME 'PERSONNEL'
    !
    ! Define the global fields for the LOG relation:
    START_TRANSACTION READ_WRITE
    !
    DEFINE FIELD TYPE
    DATATYPE IS TEXT 10.
    %RDO-W-NOCDDUPDAT, database invoked by filename, the data dictionary will not be
    updated
    !
    DEFINE FIELD REL_NAME
    DATATYPE IS TEXT 31.
    !
    ! Define the LOG relation:
    DEFINE RELATION LOG.
    TYPE.
    REL_NAME.
    END LOG RELATION.
    !
    ! Define trigger TRIG1:
    DEFINE TRIGGER TRIG1
      AFTER MODIFY OF EMPLOYEE_ID OLD CONTEXT OLD_EMP
      FOR NEW_EMP IN EMPLOYEES
      WITH NEW_EMP.EMPLOYEE_ID <> OLD_EMP.EMPLOYEE_ID EXECUTE
         FOR JH IN JOB_HISTORY
         WITH JH.EMPLOYEE_ID = OLD_EMP.EMPLOYEE_ID
            MODIFY JH USING JH.EMPLOYEE_ID = NEW_EMP.EMPLOYEE_ID
            END_MODIFY
         END_FOR
    FOR EACH RECORD
         EXECUTE
         STORE L IN LOG USING
            L.TYPE = "Modify";
            L.REL_NAME = "EMPLOYEES"
         END_STORE
    FOR EACH RECORD.
    !
    ! Test the trigger by changing the EMPLOYEE_ID of "00164" to "98765":
    FOR E IN EMPLOYEES WITH E.EMPLOYEE_ID = "00164"
      MODIFY E USING E.EMPLOYEE_ID = "98765"
      END_MODIFY
    END_FOR
    !
    ! The trigger causes a record to be stored in the LOG relation:
    FOR L IN LOG
    PRINT L.TYPE,
          L.REL_NAME
    END_FOR
     TYPE         REL_NAME
    Modify       EMPLOYEES
    !
Close Help