Using Oracle Trigger Information

This section discusses using Oracle trigger information.

The triggers that are generated on the Oracle platform reference a function that PeopleSoft delivers to obtain the PS_OPRID. This function must be installed into the Oracle database schema for the PeopleSoft database prior to creating the trigger. This function can be installed by executing the following SQL as the PeopleSoft database owner ID:

$PS_HOME\scripts\getpsoprid.sql

This example shows the Oracle trigger syntax.

/* Title: GET_PS_OPRID                                     */
/* Purpose: Retrieves the operator id (OPRID)              */
/*          from a VARCHAR2 comma separated field          */
/*          of the format 'OPRID,OS_USER,MACHINE'          */
/*          If no OPRID is found, it returns '!NoOPRID'    */
/* Limitations: (any grants, privileges, etc)              */
                                      */
drop function GET_PS_OPRID
/
create function GET_PS_OPRID (v_client_info VARCHAR2 )
        return VARCHAR2 is
        i integer;
begin
        if ( length(v_client_info) IS NULL ) then
                return('!NoOPRID');
        end if;
        if ( substr(v_client_info,1,1) = ',' ) then
                return('!NoOPRID');
        end if;
        i := 1;
        while ( (substr(v_client_info,i,1)) <> ',' and i < 32) loop
                i := i + 1;
        end loop;
        if ( i > 31 ) then
                return('!NoOPRID');
        else
                i := i - 1;
                return (substr (v_client_info, 1, i));
        end if;
end GET_PS_OPRID;
/
grant execute on GET_PS_OPRID to public
/
/* If Transaction is an Insert Or Update               */
/*    Capture After Values                             */
/* If Transaction is a Delete or Update                */
/*    Capture Before Values                            */
CREATE OR REPLACE TRIGGER PS_ABSENCE_HIST_TR
AFTER INSERT OR UPDATE OR DELETE ON PS_ABSENCE_HIST
FOR EACH ROW
DECLARE
        V_AUDIT_OPRID VARCHAR2(64);
BEGIN
    DBMS_APPLICATION_INFO.READ_CLIENT_INFO(V_AUDIT_OPRID);
  IF :OLD.EMPLID IS NULL
  THEN
        INSERT INTO PS_AUDIT_ABSENCE
        VALUES (
                GET_PS_OPRID(V_AUDIT_OPRID) ,
                SYSDATE,
                'A',
                :NEW.EMPLID,
                :NEW.ABSENCE_TYPE,
                :NEW.BEGIN_DT,
                :NEW.RETURN_DT,
                :NEW.DURATION_DAYS,
                :NEW.DURATION_HOURS,
                :NEW.REASON,
                :NEW.PAID_UNPAID,
                :NEW.EMPLOYER_APPROVED
                );
  ELSE
      IF :NEW.EMPLID IS NULL
      THEN
        INSERT INTO PS_AUDIT_ABSENCE
        VALUES (
                GET_PS_OPRID(V_AUDIT_OPRID) ,
                SYSDATE,
                'D',
                :OLD.EMPLID,
                :OLD.ABSENCE_TYPE,
                :OLD.BEGIN_DT,
                :OLD.RETURN_DT,
                :OLD.DURATION_DAYS,
                :OLD.DURATION_HOURS,
                :OLD.REASON,
                :OLD.PAID_UNPAID,
                :OLD.EMPLOYER_APPROVED
                );
      ELSE
        INSERT INTO PS_AUDIT_ABSENCE
        VALUES (
                GET_PS_OPRID(V_AUDIT_OPRID) ,
                SYSDATE,
                'K',
                :OLD.EMPLID,
                :OLD.ABSENCE_TYPE,
                :OLD.BEGIN_DT,
                :OLD.RETURN_DT,
                :OLD.DURATION_DAYS,
                :OLD.DURATION_HOURS,
                :OLD.REASON,
                :OLD.PAID_UNPAID,
                :OLD.EMPLOYER_APPROVED
                );
        INSERT INTO PS_AUDIT_ABSENCE
        VALUES (
                GET_PS_OPRID(V_AUDIT_OPRID) ,
                SYSDATE ,
                'N',
                :NEW.EMPLID,
                :NEW.ABSENCE_TYPE,
                :NEW.BEGIN_DT,
                :NEW.RETURN_DT,
                :NEW.DURATION_DAYS,
                :NEW.DURATION_HOURS,
                :NEW.REASON,
                :NEW.PAID_UNPAID,
                :NEW.EMPLOYER_APPROVED
                );
      END IF;
  END IF;
END PS_ABSENCE_HIST_TR;
/

The following command may be helpful with triggers.

List All Triggers in a Database

To list triggers:

SELECT TRIGGERNAME FROM USER_TRIGGERS; 

Executed from Schema_owner_id

SELECT TRIGGERNAME FROM ALL_TRIGGERS; 

Executed from SYSTEM

The following data dictionary views reveal information about triggers:

  • USER_TRIGGERS

        SQL> descr user_triggers;
     Name                                 Null?          Type
     -------------------------------      --------       ----
     TRIGGER_NAME                         NOT NULL       VARCHAR2(30)
     TRIGGER_TYPE                                        VARCHAR2(16)
     TRIGGERING_EVENT                                    VARCHAR2(26)
     TABLE_OWNER                          NOT NULL       VARCHAR2(30)
     TABLE_NAME                           NOT NULL       VARCHAR2(30)
     REFERENCING_NAMES                                   VARCHAR2(87)
     WHEN_CLAUSE                                         VARCHAR2(4000)
     STATUS                                              VARCHAR2(8)
     DESCRIPTION                                         VARCHAR2(4000)
     TRIGGER_BODY                                        LONG
  • ALL_TRIGGERS

        SQL> desc all_triggers;
     Name                                 Null?          Type
     -------------------------------      --------       ----
     OWNER                                NOT NULL       VARCHAR2(30)
     TRIGGER_NAME                         NOT NULL       VARCHAR2(30)
     TRIGGER_TYPE                                        VARCHAR2(16)
     TRIGGERING_EVENT                                    VARCHAR2(26)
     TABLE_OWNER                          NOT NULL       VARCHAR2(30)
     TABLE_NAME                           NOT NULL       VARCHAR2(30)
     REFERENCING_NAMES                                   VARCHAR2(87)
     WHEN_CLAUSE                                         VARCHAR2(4000)
     STATUS                                              VARCHAR2(8)
     DESCRIPTION                                         VARCHAR2(4000)
     TRIGGER_BODY                                        LONG

The new column, BASE_OBJECT_TYPE, specifies whether the trigger is based on DATABASE, SCHEMA, table, or view. The old column, TABLE_NAME, is null if the base object is not table or view.

The column ACTION_TYPE specifies whether the trigger is a call type trigger or a PL/SQL trigger.

The column TRIGGER_TYPE includes two additional values: BEFORE EVENT and AFTER EVENT, which are applicable only to system events.

The column TRIGGERING_EVENT includes all system and DML events.

List the Trigger Definition

To list the trigger definition:

Select Trigger_Name,  Trigger_Body  from USER_TRIGGERS
 where Trigger_name=trigger_name;

List Trigger Information

To list trigger information:

Select Trigger_Name, Trigger_Type, Triggering_Event, Table_Owner,
Table_Name, Referencing_Names,When_Clause, Status, Description, 
Trigger_Body from USER_TRIGGERS where Trigger_name=trigger_name;

To Remove a Trigger

To remove a trigger:

drop trigger TRIGGERNAME

To Modify an Existing Trigger

On Oracle, to explicitly alter a trigger definition, use the CREATE OR REPLACE option. See a full explanation in the Oracle SQL Reference (CREATE TRIGGER).

To Disable a Trigger

By default, triggers are enabled when they're first created. Disable a trigger by using the ALTER TRIGGER statement with the DISABLE option.

For example, to disable the trigger named REORDER of the INVENTORY table, enter the following statement:

ALTER TRIGGER Reorder DISABLE;

All triggers that are associated with a table can be disabled with one statement by using the ALTER TABLE statement with the DISABLE clause and the ALL TRIGGERS option. For example, to disable all triggers that are defined for the INVENTORY table, enter the following statement:

ALTER TABLE Inventory
    DISABLE ALL TRIGGERS;