How To Solve Mutating Error In Oracle
SQL TuningSecurityOracle UNIXOracle LinuxMonitoringRemote supportRemote plansRemote servicesApplication Server ApplicationsOracle FormsOracle PortalApp UpgradesSQL ServerOracle ConceptsSoftware SupportRemote Support Development Implementation Consulting StaffConsulting PricesHelp Wanted! Oracle PostersOracle Books Oracle Scripts Ion Excel-DB Don Burleson Blog
Fix Oracle mutating trigger table errors Oracle Database Tips by Burleson Consulting A mutation table is defined as a table that is changing. But in dealing with triggers, it is a table that has the possibility of changing. What this means to a trigger is that if the trigger reads a table, it can not change the table that it read from. This does not impact the exclusive use of :OLD and :NEW. It says that if the trigger reads the table (such as using a SELECT query), that changes (even using :NEW) will fail. This can also happen when a trigger on a parent table causes an insert on a child table referencing a foreign key. Mutating Tables Each new release of the Oracle database reduces the impact of the mutating table error on triggers and they are much less of a problem with Oracle9i and above. If a trigger does result in a mutating table error, the only real option is to rewrite the trigger as a statement-level trigger. Mutating table errors only impact row level triggers. But to use a statement level trigger, some data may need to be preserved from each row, to be used by the statement level trigger. This data can be stored in a PL/SQL collection or in a temporary table. A simple row level trigger that causes a mutating table error can result in a very complicated statement level trigger to achieve the needed result. Here are some important items to remember about triggers. On insert triggers have no :OLD values. On delete triggers have no :NEW values. Triggers do not commit transactions. If a transaction is rolled back, the data changed by the trigger is also rolled back. Commits, rollbacks and save points are not allowed in the trigger body. A commit/rollback affects the entire transaction, it is all or none. Unhandled exceptions in the trigger will cause a rollback of the entire transaction, not just the trigger. If more than one trigger is defined on an event, the order in which they fire is not defined. If the triggers must fire in order, you must create one trigger that executes all the actions in the required order. A trigger can cause other events to execute triggers. A triggeSocial Links Printer Friendly About Search 8i | 9i | 10g | 11g | 12c | 13c | Misc | PL/SQL | SQL | RAC | WebLogic | Linux Home » Articles » 9i » Here Mutating Table Exceptions Mutating table exceptions occur when we try to reference the triggering table in a query from within row-level trigger code. In this article I'll present examples of how a mutating table exception might occur and simple methods to get round it. Test Schema http://www.dba-oracle.com/t_avoiding_mutating_table_error.htm Mutating Table Demonstration Solution 1 (Collection in Package Variable) Solution 2 (Global Temporary Table) Test Schema The following schema objects are necessary to run the code in this article. CREATE TABLE tab1 ( id NUMBER(10) NOT NULL, description VARCHAR2(50) NOT NULL ); ALTER TABLE tab1 ADD ( CONSTRAINT tab1_pk PRIMARY KEY (id) ); CREATE SEQUENCE tab1_seq; CREATE TABLE tab1_audit https://oracle-base.com/articles/9i/mutating-table-exceptions ( id NUMBER(10) NOT NULL, action VARCHAR2(10) NOT NULL, tab1_id NUMBER(10), record_count NUMBER(10), created_time TIMESTAMP ); ALTER TABLE tab1_audit ADD ( CONSTRAINT tab1_audit_pk PRIMARY KEY (id) ); ALTER TABLE tab1_audit ADD ( CONSTRAINT tab1_audit_tab1_fk FOREIGN KEY (tab1_id) REFERENCES tab1(id) ); CREATE SEQUENCE tab1_audit_seq; Mutating Table Demonstration Let's assume we need to audit the actions on the parent table and for some reason, this involves querying the triggering table. We can demonstrate this with the following package and trigger. We place all our trigger code into a package as follows. CREATE OR REPLACE PACKAGE trigger_api AS PROCEDURE tab1_row_change (p_id IN tab1.id%TYPE, p_action IN VARCHAR2); END trigger_api; / SHOW ERRORS CREATE OR REPLACE PACKAGE BODY trigger_api AS PROCEDURE tab1_row_change (p_id IN tab1.id%TYPE, p_action IN VARCHAR2) IS l_count NUMBER(10) := 0; BEGIN SELECT COUNT(*) INTO l_count FROM tab1; INSERT INTO tab1_audit (id, action, tab1_id, record_count, created_time) VALUES (tab1_audit_seq.NEXTVAL, p_action, p_id, l_count, SYSTIMESTAMP); END tab1_row_change; END trigger_api; / SHOW ERRORS Next we create the row-level trigger itself to catch any changes to the table. CREATE OR REPLACE
4 ORA-04088: error during execution of trigger 'TRG_GET_ID_APP'. We studied the "Mutating Table" Problem and found the following explanations in the Oracle8i Application Developer's Guide. A mutating table is a table that is currently being modified by an UPDATE, http://www.akadia.com/services/ora_mutating_table_problems.html DELETE, or INSERT statement, or it is a table that might need to be http://www.geekinterview.com/question_details/38947 updated by the effects of a declarative DELETE CASCADE referential integrity constraint. The restrictions on such a table apply only to the session that issued the statement in progress. For all row triggers, that were fired as the result of a DELETE CASCADE, there are two important restrictions regarding mutating tables. These restrictions prevent a trigger from seeing an how to inconsistent set of data. The SQL statements of a trigger cannot read from (query) or modify a mutating table of the triggering statement. Example 1 Select in a mutating table from a row trigger (Tested on Oracle 8.1.7) We want to explain this situation on an example. We have two tables "A" and "B". "A" is the master table and "B" the detail table. We specified a foreign key between "B" and "A" how to solve with the CASCADE DELETE option. Here are the CREATE statements drop table B; drop table A; create table A ( ida number not null, vala varchar2(10), primary key(ida)); create table B ( idb number, valb varchar2(10), foreign key (idb) references A (ida) on delete cascade) / create or replace trigger b_br after delete on B for each row declare n integer; begin select count(*) into n from A; dbms_output.put_line('there are ' || n || ' rows in A'); dbms_output.put_line('after statment on B'); dbms_output.new_line; end; / insert into A values(1,'Table A'); insert into A values(2,'Table A'); insert into B values(1,'Table B'); insert into B values(1,'Table B'); commit; set serveroutput on; delete from A where idA = 1; ERROR at line 1: ORA-04091: table SCOTT.A is mutating, trigger/function may not see ORA-06512: at "SCOTT.B_BR", line 4 ORA-04088: error during execution of trigger 'SCOTT.B_BR' Notice that the SQL statement ( "select count(*) into n from A" ) is run for the first row of the table, and then the AFTER row trigger B_BR is fired. In turn, a statement in the AFTER row trigger body attempts to query the original table A. However, because the table A is mutating due to the CASCADE DELETE foreign key, this query
Management Accounting Operating System Operating System Android iOS Microsoft Coding Programming J2EE Languages Database Database Data Warehousing Oracle Applications Applications Clarify CRM Oracle Apps Peoplesoft Siebel Software Testing Testing Testing Tools Miscelleanous Helpdesk Mainframe Networking SAP R/3 Web Interview Coaching Career Counseling Job Interview Interview eBooks Accounting eBook C eBook Citrix eBook Job Interview eBook Career Advice Career Change Jobs Help Projects Requests Resume Help Training Advice Engineering Chemical Engineering Civil Engineering Electrical Engineering Electronics Engineering Micro Processor Mechanical Engineering By Company Ask Question Home Interview QuestionsOraclePL/SQL What is mutating trigger? How do you resolve it?If a trigger body is trying to update dependent tables, will it get a mutating error? Interview Candidate Dec 1st, 2006 16 52625 PL/SQL Answer First Prev Next Last Showing Answers 1 - 16 of 16 Answers PAWAN AHUJA Dec 3rd, 2006 Mutating trigger is trigger that is currently being modified by DML opertion.we can resolve it by applying statement lelel trigger.RegardsPawan Ahuja
Was this answer useful?Yes 1 Reply manikandan Dec 8th, 2006 if the trigger attempts to select or modify the table while the trigger has not completed (ie. table is in transition). then mutating trigger error occurs.because the table is in middle of a transaction so it causes the trigger to mutate.you can change the trigger to statement level and apply the logic there. Was this answer useful?Yes Reply vikramssheth ProfileAnswers by vikramssheth Jan 30th, 2007 We can override this problem using temporary Table Concept. Was this answer useful?Yes Reply sripri ProfileAnswers by sripriQuestions by sripri May 8th, 2007 Mutating trigger has similar concept to that of deadlock. When a table is in the half way of executing a transaction and is the owner of a trigger and if the same table is accessed by the trigger somewhere else in the same time then at that instance mutating trigger occurs. Was this answer useful?Yes Reply Robert ProfileAnswers by RobertQuestions by Robert May 8th, 2007 To avoid Mutating trigger there are many ways. One of the best approach is to make use of the after trigger which clearly takes care of concurrency problems associated with mutating triggers .When