Two after insert triggers

I have two "after insert ...for each row" triggers on the same table. Can I ensure that one will always run before the other?
I have put DBMS_OUTPUT.PUT_LINE statements in the triggers to see which one runs first. But when the table and triggers are re-created in another schema in another database, they run in a different order.
The schema comes from a third party vendor, so we are reluctant to change the logic.
This has always been a concern of mine and I've seen this issue before. If two triggers on the same table have the same triggering event and time specification, will one always run before the other or will the order of execution vary?
Kevin Tyson, OCP
[email protected]

No. You cannot guarantee the order that two triggers are fired in if they have the same triggering event and specification. You can either write the triggers so that their logic is completely independent or you can move the trigger logic into stored procedures and call those stored procedures from a single trigger. Your trigger body might be
BEGIN
  vendor_logic( :old.col1, :new.col3 );
  our_logic( :new.col2 );
END;Justin
Distributed Database Consulting, Inc.
http://www.ddbcinc.com/askDDBC

Similar Messages

  • Difference between Before INSERT and After INSERT trigger?

    What is difference between Before INSERT and After INSERT triggers? Can anyone give me a simple example from SCOTT schema for both of these triggers.

    The documentation gives a good explanation have you looked at....
    http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm#sthref1175

  • "Refresh after" insert fails for DB-View with INSTEAD OF Triggers

    Hi,
    I have a database view with INSTEAD OF triggers defined for INSERT, UPDATE, DELETE.
    For some EO attributes the refresh after insert and update is defined.
    Posting to database fails.
    According to Database 9.2 Manual and a previous thread (BC4J and Updatable Views the RETURNING clause is not allowed for database views with INSTEAD OF triggers.
    Is there a workaround so the refresh after is done, but without the RETURNING feature?
    I only need to refresh some values. The PK i can set in the create method of the EO so refresh via a additional SELECT would be possible.
    If not Feature Request:
    Add the possibility to do the "refresh after ..." with a 2nd SELECT using the PK instead of using the RETURNING clause.
    Of course then it is not possible to set the PK in the database trigger. PK has to be set in the create method of the EO.
    Thanks,
    Markus
    GEMS IT

    Hi Markus,
    Turning on the stack trace (-Djbo.debugout put=Console - in the Project/runner) did help and I should have done it sooner. Turns out that when I constructed my EO based upon a database view - I should have left out the PKs of the base tables.
    In my case, I am using an "Instead Of Trigger" to populate a multi-table arrangement (parent - child - grandChild - greatGrandChild relationship) where all base tables are using dbSequence/dbTriggers.
    Final analysis - I would like to see BC4J handle this situation. I do not want to use View-Links and I should * not * have to resort to stored procedures and BC4J/doDML. If I construct a DB View this is participating in an parent - child - grandChild - greatGrandChild relationship that are using dbSequence/dbTriggers, then BC4J should be smart enough to construct VO knowing that I want to do insert, update, delete, selects - based upon this structure.
    Thanks Markus,
    Bill G...

  • How to Run sequencially two Key-Commit triggers with different scope

    Hi all
    I have two Key-Commit triggers at form and Block level. Form level trigger is inherited from a library. In block level trigger, I have some additional checks. What I want is, to execute the Block level trigger first and than the form level. I tried working with the override/Before/after property of triggers which does the job of sequencing execution but the Raise Form_Trigger_Failure in the block level trigger doesn't stop the execution of form level trigger. Block level trigger does the checks and display corresponding alerts but than the form level trigger also executes.
    I don't wanna copy the code from Form level trigger to the block level trigger as it is common to whole application and may need some additional coding/ bug fixing later.
    Any help would be appreciated.
    RMA

    Thanks for all the help.
    In Key-Commit trigger I am just setting the Blocks' properties, nothing special, the main checks are in On-Commit trigger. I also understand the work around by using a user defined trigger but, to my knowledge, Oracle doesn't recommend it.
    My form has two datablocks, Parent and a child. The entered quantity in the Master block needs to be verified against the Number of units entered in the child block. If they are not the same, I want the alert and stop execution.
    Now I am using Pre-Insert trigger in the master block but was a little surprised because of the sequencing behavior. My understanding was that RAISE FORM_TRIGGER_FAILURE stops execution of all the code after it even is it is in another trigger/procedure ..but now it appears that I was wrong :-(
    Any suggestions??
    RMA

  • Error on Trigger After Insert

    I am having two table based on insertion on table one i have created trigger , trigger will insert the data to table two
    i am getting the error when i execute for the second time i.e i have execute one record each successfully in both tables.
    on second time i'm getting this error
    CREATE OR REPLACE TRIGGER Triggername
    AFTER INSERT ON mytable
    DECLARE v_local varchar2(1800);
    BEGIN
    SELECT col1 INTO v_local FROM myschema.mytab;
    insert into mytable (Col1,Col2,Col3)
    with t1 as( select v_local str from dual),
    t2 as( Select startid, endid from SplitLayout),
    t3 as
    ( select str,startid s,endid e, row_number() over(order by startid) rn from t1,t2)
    select * from t3 pivot
    max(substr(str,s,e)) str for rn in (1,2,3);
    End;
    startid,Endid
    1,1
    2,1
    3,1
    ERROR at line 1:
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-06512: at "myschema.Triggername", line 4
    ORA-04088: error during execution of trigger 'myschema.Triggername'
    ORA-06512: at "myschema.SPname", line 4
    ORA-06512: at line 1

    Hi,
    eleven less than yesterday. That's good for a start. But keep on tidying up.
    Concerning your trigger-problem, "933663" is very right to say
    >
    you are creating a AFTER INSERT trigger on MYTABLE, which will again insert data into MYTABLE ..!!!!
    >
    I can't either see why this should be sensible. Do you know the concept of :new and :old. Have a look at
    [url http://docs.oracle.com/cd/E11882_01/server.112/e25789/srvrside.htm#CNCPT118]Overview on Triggers. DML-Triggers should interest you most for now.
    As far as I understand your first posting the following passage causes the problems
    >
    SELECT col1 INTO v_local FROM myschema.mytab;to analyze if this statement causes the
    >
    ORA-01422: exact fetch returns more than requested number of rows
    >
    you may execute something like
    select count (*)
    from myschema.mytab
    group by col1
    having count(*) > 1;Good luck
    Bye
    stratmo

  • Refresh LOV after inserting data in correspondent table

    Hi all,
    I am using Jdeveloper 11.1.1.2 and ADFBC.
    I have a page with a table (tableA) with some fields. One of them has a LOV associated to another table(tableB). I have a button (button1) that shows a popup(popup1) and opens a new task flow with a fragment to insert data in the tableB.
    After inserting/modifying rows in tableB and after pressing commit (property: end-transaction) or rollback buttons (property: end-transaction and restore save point), LOV does not refresh.
    I have tried to set the property partial triggers of the LOV to button1 or popup1 and it does not work.
    How can I solve it?
    Thank you.
    Andrea

    How about VO for table B ? Did you refresh that ? I didn't use the same VO for table & LOV.
    so in "List data Source" -- VO -- I am using "SQL statement" and statement includes fields from Table B and Table A.
    VO for LDS using "Rows populated by a SQL query with read-only access". I didn't use "Updateable Access through Entity Objects".
    Sample of VO of LDS:
    select A.model_number modelNumber, a.part_number partNumber, b.MODEM_TYPE ModemType
    from table A a,Table B b
    where a.PART_NUMBER_ID = b.PART_NUMBER_ID
    and a.part_number_id =:partID
    Edited by: albertpi on Mar 16, 2010 7:26 AM

  • How can i  print reports to different printer by use Trigger on table after insert

    Hello,
    Please can any one tell me how can i print (any message) to different printer (network & local printer) by use Trigger on table after insert.
    regards,
    Linda.

    What you want to do cannot be done with PL/SQL, which does have any print utilities. However you could write something using Java Stored Procedures.
    Of course the "different printer" bit will have to be data driven as triggers are not interactive.
    rgds, APC

  • After Insert Trigger Not Working

    Hi All,
    I am not a guru in writing triggers.
    I am inserting new records in a Table FA_BOOKS by application and this inserts records in FA_ADDITIONS_B. This is a vanilla process.
    i have written a trigger on FA_ADDITIONS_B, and i want to update the cost from the fa_books to fa_additions_b column attribute21
    The trigger i have written is After insert on FA_ADDITIONS_B and i try to select cost from the fa_books for the :new.asset_id.
    SELECT COST
    INTO v_cost
    FROM FA_BOOKS
    WHERE ASSET_ID = :NEW.ASSET_ID;
    this is always returning no_data_found exception and i do not understand how to update the attribute21 in FA_ADDITIONS_B
    Here is a sample of my trigger.
    CREATE OR REPLACE TRIGGER update_attribute21_new_asset_1
    after INSERT ON fa_ADDITIONS_B
    FOR EACH ROW
    DECLARE
    V_COST NUMBER;
    BEGIN
    SELECT COST
    INTO v_cost
    FROM FA_BOOKS
    WHERE ASSET_ID = :NEW.ASSET_ID;
    update fa_ADDITIONS_B
    set attribute21 = v_cost
    where ASSET_ID = :NEW.ASSET_ID;
    END;
    Any help on this will be appreciated.
    TX in advance.
    Regards,

    I still haven't understood the reason why you can't transfer the COST information from FA_BOOKS to FA_ADDITIONS_B in the initial trigger on FA_BOOKS that populates FA_ADDITIONS_B. Or how is the population of FA_ADDITIONS_B accomplished? Is it part of the application code?
    Regarding the NO_DATA_FOUND issue:
    Is it ensured that populating the FA_ADDITIONS_B table is done in the same transaction as the FA_BOOKS inserts or that the FA_BOOKS transaction is committed?
    Why do you need that additional trigger?
    My assumption is that you're in a trigger "chain" - if I get your approach correctly - you're basically attempting to query FA_BOOKS in a trigger on FA_ADDITIONS_B that in turn has been triggered by a trigger on FA_BOOKS which gets us back to the "mutating" trigger issue. You can't read a table that is currently in the process of being modified.
    Or even worse: The (potential) trigger on FA_BOOKS that populates FA_ADDITIONS_B uses "autonomous transaction" and therefore the trigger on FA_ADDITIONS_B can't see the changes of the original transaction.
    As already mentioned: Be very careful with "autonomous transactions" in general. There are only a few cases where these are actually useful (e.g. logging purposes), but Tom Kyte has written numerous articles why triggers and in particular autonomous transactions are mostly evil.
    Regards,
    Randolf
    Oracle related stuff blog:
    http://oracle-randolf.blogspot.com/
    SQLTools++ for Oracle (Open source Oracle GUI for Windows):
    http://www.sqltools-plusplus.org:7676/
    http://sourceforge.net/projects/sqlt-pp/

  • Calling of Stored Procedure in After Insert Trigger

    Can I call a Stored Procedure in After Insert Trigger ?
    Please send a sample code (good example) of After Insert Trigger.
    Thanks.

    Kishore,
    I have two table WLCS_ORDER, WLCS_ORDER_LINE
    WLCS_ORDER - It holds order header information like
    ORDER_ID
    CUSTOMER_ID
    TRANSACTION_ID
    STATUS
    ORDER_DATE
    SHIPPING_METHOD
    SHIPPING_AMOUNT
    SHIPPING_CURRENCY
    PRICE_AMOUNT
    PRICE_CURRENCY
    SHIPPING_GEOCODE
    SHIPPING_STREET1
    SHIPPING_STREET2
    SHIPPING_CITY
    SHIPPING_STATE
    SHIPPING_COUNTRY
    SHIPPING_POBOX
    SHIPPING_COUNTY
    SHIPPING_POSTAL_CODE
    SHIPPING_POSTAL_CODE_TYPE
    SPECIAL_INSTRUCTIONS
    SPLITTING_PREFERENCE
    ORDER_SUBTOTAL
    WLCS_ORDER_LINE - It holds all order lines information like
    ORDER_LINE_ID
    QUANTITY
    PRODUCT_ID
    TAX_AMOUNT
    TAX_CURRENCY
    SHIPPING_AMOUNT
    SHIPPING_CURRENCY
    UNIT_PRICE_AMOUNT
    UNIT_PRICE_CURRENCY
    MSRP_AMOUNT
    MSRP_CURRENCY
    DESCRIPTION
    ORDER_ID
    TOTAL_LINE_AMOUNT
    Relation between WLCS_ORDER, WLCS_ORDER_LINE is one to many.
    For each WLCS_ORDER row, one or more order lines will insert into WLCS_ORDER_LINE table.
    For each new row in WLCS_ORDER table, I have to update the following columns in both the tables with my maths.
    WLCS_ORDER
    shipping_amount
    price_amount
    order_subtotal
    WLCS_ORDER_LINE
    shipping_amount
    I thought I can do this in after insert trigger, But if it is not possible, Please give the best way to fulfill this requirement.
    I appreciate your help.
    Have a great day.
    Srinivas

  • ORA-01403: no data found  -  refresh after insert on view

    Hi all,
    I have problems with refresh after insert on view and i override this method on my xxDefImpl.java
    public boolean isUseReturningClause() {
    return false;
    Anyway what it does is to substitute the RETURNIN INTO to
    SELECT ID INTO ? FROM MY_VIEW WHERE ID=?; END;".
    And this gives me the error
    ORA-01403: no data found ORA-06512: at line 1
    Because i'm tryint to insert on my view with ID = -1
    And then the view and the my triggers make it happen to became a real ID.
    The thing is that i need to refresh my ID after insert and it runs this select with -1 and it finds no data of course because the trigger on the view and on my tables transformed it in a real ID .
    DO u know what's missing?

    See section 26.5 Basing an Entity Object on a Join View or Remote DBLink in the ADF Developer's Guide for Forms/4GL Developers for the additional tip I believe you're missing about marking a unique attribute as well.
    You can find the guide on the ADF Learning Center on OTN here:
    http://www.oracle.com/technology/products/adf/learnadf.html

  • Mutating table exception on trigger with After Insert but not with before

    Hi
    I need to maintain some constraint on the table to have only one row for values of the columns but not by primary key constraint.
    Because in case of primary key the insert would fail and the rest of the operation would be discontinued, I cannot change in the somponent that inserts the row so I have to prevent that on the table I have.
    I created a before insert trigger on the table which checks if any row exists in the table with same column values as the one being inserted. if found I delete the rows and let the insert happen (w/o raising any error). if the rows do not exist then the insert shall be continued.
    I read at place that modifying the dame table in the trigger body shall raise a mutating table exception, but I donot get the exception when the trigger is fired.
    Just when I change the trigger to after insert trigger then the nutating table exception is thrown.
    Is it the right behavior i.e. the Before insert trigger does not raise the exception and only after insert does that, since I could not find the example for before insert triggers throwing such exception so I think it is better to confirm it before finalizing the implementation.
    Thanks
    Sapan

    sapan wrote:
    Hi Tubby
    I cannot user unique constraint because that would raise an exception upon violation and the third party component that is inserting in the table would fail.
    That component does some other tasks as well after this insert and if an exception is raised then those tasks would not be performed.
    Also I cannot change the component to ignore this exception.Well then, you're in a bit of a pickle.
    I'm guessing the trigger you have been working on isn't "safe". By that i mean that it doesn't account for multi-user scenarios. You'll need to serialize access to the data elements in question and implement some sort of locking mechanism to ensure that only 1 session can work with those values.
    After you work out how to do that it sounds as though you would be better served using an INSTEAD OF trigger (you'd need to implement this on a view which is made off of your base table).
    Here's one way you can work on serializing access to your table on a relatively fine grained level (as opposed to locking the entire table).
    Re: possible to lock stored procedure so only one session may run it at a time?
    Cheers,

  • Can't able to use :NEW in after insert trigger

    When i am trying to assign value to an element of the NEW pseudo record, its giving error like :new pseudo record can't be used in this type of trigger.
    What exactly i've done is given below
    create or replace triger tri_name
    after insert
    on tab_name
    for each row
    begin
    if :new.x='123' then
    :new.y:=null;
    end if;
    end tri_name;
    Thanks & Regards
    --DKar                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

    from oracle documentation...
    Old and new values are available in both BEFORE and AFTER row triggers. A new column value can be assigned in a BEFORE row trigger, but not in an AFTER row trigger (because the triggering statement takes effect before an AFTER row trigger is fired). If a BEFORE row trigger changes the value of new.column, then an AFTER row trigger fired by the same statement sees the change assigned by the BEFORE row trigger.
    for more details read the documentation

  • Resultset after insertion is the same before insertion

    hi guys, i get an updatable resultset from a connection then used it to insert a new row but the result set doesn't chane after insertion, i mean the no of rows before insertion is the same after insertion and also the data, this is the code prove what i say
              int currentRow = resultset.getRow();
              display(resultset);
              resultset.moveToInsertRow();
              for (int i = 0; i < fields.size(); i++) {
                updateCurrentRow(resultset, fields.getField(i));
              resultset.insertRow();
              display(resultset);the display function body is
            int currentRow = res.getRow();
            res.first();
            while (true)
              System.out.println("CountyCode= " + res.getInt(1));
              System.out.println("CountyName= " + res.getString(2));
              if (!res.next())
                break;
            res.absolute(currentRow);Please help me
    N.B.
    the type of resultset after creation it is res.getConcurrency() == ResultSet.CONCUR_UPDATABLE?????
    Thanks for your efforts

    thnaks for your reply, but when i used
    ownInsertsAreVisible() method; returned true, that is
    mean that the driver and DB supports the updating of
    reultset after insertion. but this is not real at my
    case? that was strange. if you have any comment please
    do,just checking the row is in fact being inserted into the database? i mean you can't see it right away but you can see it later right?
    if the row is being inserted and the ownInsertsAreVisible() returns true then there are two possible scenarios.
    1) the cursor type of your result set does not support that method, meaning the method is true in some cases but not yours... for example your query might have a join or something which makes it not possible for the result set do be fully cognizant of changes. and sometimes there are database specific cursors that have to specified as part of your query in a proprietary way to get the "right" cursor. you will need to investigate the docs for your database to figure out if any of this is true.
    2) the meta data is lying.

  • AFTER INSERT OR UPDATE TRIGGER the insert not working

    The update works but the insert is not working. I have two version that I have tried. I amd executing the inserts/update from Oracle Applications and the table row is either being inserted or updated correctly.
    DROP TRIGGER APPS.CCC_HZ_ORG_CONTACTS_ARU;
    CREATE OR REPLACE TRIGGER APPS.CCC_HZ_ORG_CONTACTS_ARU
    /* --Created By: SKELLEHER
    --Creation Date: 07/15/09
    --Last Updated By:
    --Last Update Date:  
    AFTER INSERT OR UPDATE OF department, job_title
    ON apps.hz_org_contacts
    FOR EACH ROW
    WHEN (
    NEW.department <> OLD.department OR
    NEW.job_title <> OLD.job_title
    DECLARE
    v_ChangeType VARCHAR2(10);
    BEGIN
    /* Use 'I' for Insert, 'U'' for Update, and'D' for delete(not part of app at this time). */
    IF INSERTING THEN
    v_ChangeType := 'INSERT';
    ELSIF UPDATING THEN
    v_ChangeType := 'UPDATE';
    ELSE
    v_ChangeType := 'DELETE';
    END IF;
    INSERT INTO cust.ccc_tca_po_tf_event_tbl
    VALUES (ccc_tca_po_tf_event_tbl_s.NEXTVAL
    , 'hz_org_contacts'
    , v_ChangeType
    , 'org_contact_id'
    , :NEW.org_contact_id
    , 'PENDING'
    , NULL
    , 0
    , 'N'
    , 'Y'
    , :NEW.LAST_UPDATED_BY
    , :NEW.LAST_UPDATE_DATE
    , -1
    , SYSDATE
    , 'DEPARTMENT_JOBTITLE_UPDATE'
    ,'LDAP'
    END;
    AND I TRIED ANOTHER VERSION:

    I have simplified it so it's just checking for insert but it's not picking up. Is the syntax IF INSERTING correct?
    CREATE OR REPLACE TRIGGER APPS.CCC_HZ_ORG_CONTACTS_ARU
    AFTER INSERT OR UPDATE
    ON ar.hz_org_contacts
    FOR EACH ROW
    DECLARE
    BEGIN
    IF INSERTING THEN
    INSERT INTO cust.ccc_tca_po_tf_event_tbl
    VALUES (ccc_tca_po_tf_event_tbl_s.NEXTVAL
    , 'hz_org_contacts'
    , 'UPDATE'
    , 'org_contact_id'
    , :NEW.org_contact_id
    , 'PENDING'
    , NULL
    , 0
    , 'N'
    , 'Y'
    , :NEW.LAST_UPDATED_BY
    , :NEW.LAST_UPDATE_DATE
    , -1
    , SYSDATE
    , 'DEPARTMENT_JOBTITLE_UPDATE'
    ,'LDAP'
    END IF;
    END;
    /

  • The row was not found at the Subscriber error keeps popup and stopped synchronization even after inserting missing record at subscriber - transcational replication.

    The row was not found at the Subscriber error keeps popup and stopped synchronization even after inserting missing record at subscriber - transcational replication.
    first error throws: Grab exact sequence number, find row and inserted at subscriber...
    Start synchronizing, ran fine for a while, stopped again with error with different exact sequence number, repeat again same as step 1.......
    how can we stop this and make it run without this error?
    Please advise!!!

    Hi,
    This means that your database is out of sync. You can use the continue on data consistency error profile to skip errors. However, Microsoft recommends that you use -SkipErrors parameter cautiously and only when you have a good understanding of the following:
    What the error indicates.
    Why the error occurs.
    Why it is better to skip the error instead of solving it.
    If you do not know the answers to these items, inappropriate use of the
    -SkipErrors parameter may cause data inconsistency between the Publisher and Subscriber. This article describes some problems that can occur when you incorrectly use the
    -SkipErrors parameter.
    Use the "-SkipErrors" parameter in Distribution Agent cautiously
    http://support.microsoft.com/kb/327817/en-us
    Here are two similar threads you may refer to:
    http://social.technet.microsoft.com/Forums/en-US/af531f69-6caf-4dd7-af74-fd6ebe7418da/sqlserver-replication-error-the-row-was-not-found-at-the-subscriber-when-applying-the-replicated
    http://social.technet.microsoft.com/Forums/en-US/f48c2592-bad7-44ea-bc6d-7eb99b2348a1/the-row-was-not-found-at-the-subscriber-when-applying-the-replicated-command
    Thanks.
    Tracy Cai
    TechNet Community Support

Maybe you are looking for