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'
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