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 ITHi 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.
RMAThanks 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 -
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 1Hi,
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.
AndreaHow 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
Sapansapan 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
--DKarfrom 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 effortsthnaks 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.
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
-
After I close the window/s the report error window pops up . Then the next one which tells me the report was sent. Then the options to go further and so I came here today and Now I have done what you said to do so far. I even updated Acrobat reader a
-
I cannot open my trash, it says it is now 'over quota'. I cannot even received emails if they are sent there! I have been trying to make my settings higher in the 'advanced' menu to no avail. I have been trying to move emails out of my INBOX to the t
-
Changing font size for motorola droid's emails
Hi, is there a way of changing the font size with the motorola droid, when working with emails? The emails font seem a bit small. a Little hard to read. I'd like the font to be larger. Thanks.
-
After recently moving the Lightroom folder to an external hard drive, Lightroom shows thumbnails of images, but can't locate the files. We've chosen the new folder location in preferences, but after restarting the computer and the program, the list o
-
No tabs are showing when only one window open. How do I open a new tab?
Just upgraded to latest version. When only one window is open, no tabs show across the top. If I have two tabs open, both show across the top, but go to no tabs if I close one of them. And, the + sign is available for opening a third tab if at least