Ini (atau setidaknya diketahui) bahwa Anda tidak dapat menggunakan pernyataan DML pada tabel bermutasi di dalam pemicu. Kutipan dari dokumentasi Oracle :
Tabel mutasi adalah tabel yang sedang dimodifikasi oleh pernyataan UPDATE, DELETE, atau INSERT, atau tabel yang mungkin diperbarui oleh efek dari batasan DELETE CASCADE.
Sesi yang mengeluarkan pernyataan pemicu tidak dapat meminta atau mengubah tabel mutasi. Pembatasan ini mencegah pemicu dari melihat set data yang tidak konsisten.
Namun, saya tidak bisa mengerti mengapa pemicu demo ini tidak gagal dengan kesalahan "tabel mutasi" ketika saya melakukan insert into emp
menggunakan SQL Developer atau SQL * Plus:
CREATE OR REPLACE TRIGGER emp_bri
BEFORE INSERT ON emp
FOR EACH ROW
BEGIN
SELECT max(id) + 1 INTO :NEW.id FROM emp;
UPDATE emp SET salary = 5000;
END emp_bri;
Penyisipan berhasil diselesaikan dengan nilai berikutnya id
dan memperbarui semua emp
catatan. Saya menggunakan Oracle Database 11g Enterprise Edition Release 11.2.0.1.0. Saya telah membaca tentang pemicu senyawa tetapi sampel tidak menggunakannya.
sumber
select max(id)
untuk menetapkan nomor unik. Hanya saja, jangan. Itu hanya salah dan tidak akan skala juga.Jawaban:
Ada pengecualian. Saat Anda menentukan
before insert
pemicu, tingkat baris pada tabel dan mengeluarkanINSERT
pernyataan baris tunggal ,table is mutating
kesalahan tidak akan dinaikkan. Tetapi jika Anda mendefinisikan jenis pemicu yang sama dan mengeluarkan pernyataan multi-barisINSERT
, kesalahan akan dimunculkan. Berikut ini sebuah contoh:Berikut ini adalah
insert
pernyataan baris tunggal , yang tidak akan meningkatkan kesalahan tabel mutasi:Berikut ini adalah pernyataan penyisipan multi-baris, yang akan memunculkan kesalahan tabel mutasi:
sumber
ID 132569.1
(ORA-4091 on BEFORE ROW TRIGGER with INSERT .. into SELECT statement
).