Translate

Monday, August 8, 2016

Mutating table



Mutating table adalah
sebuah table yang secara current dimodifikasi dengan UPDATE,DELETE,atau INSERT statement ,atau
sebuah table yang butuh diupdate dengan memberi efek dari sebuah deklaratif  referential integrity DELETE CASCADE .

untuk semua baris trigger ,yang difired sebagai hasil dari DELETE CASCADE ,ada dua restriksi yang penting berkenaan dengan mutating table.Restriksi ini mencegah  sebuah trigger  untuk melihat set data yang tidak consistent.

Sebuah trigger dari sql statement tidak bisa mem BACA dari(query) atau me MODIFIKASI sebuah mutating table dari statement trigger.

Example 1,

Select dalam mutating table dari sebuah row trigger(tested on oracle 8.1.7)

-Situasinya terdapat dua table A dan B . A adalah master table dan B adalah detail table .Kita mendefinisikan sebuah foreign key antara B dan A dengan opsi CASCADE DELETE.


create statement nya :

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 statement 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(2,’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'

Catatan : SQL statement(“select count(*) into n from A ”) di run untuk baris pertama dari table ,dan kemudian AFTER row trigger b_br fired.Pada gilirannya ,sebuah statement dalam AFTER row trigger body mencoba untuk meng-query table A yang original.Bagaimanapun,karena table A adalah mutating karena foreign key CASCADE DELETE ,query nya tidak diijinkan oleh oracle.Jika dicoba maka runtime error akan terjadi,efek dari badan trigger and mentrigger statement dikembalikan,dan control di return ke user atau application.

No comments:

Post a Comment

silahkan membaca dan berkomentar