Anda tidak dapat, secara umum, menerapkan batasan semacam ini dalam pemicu. Anda perlu menggunakan batasan.
Masalah yang akan Anda hadapi jika mencoba menggunakan pemicu adalah bahwa Anda biasanya akan menemukan pengecualian "tabel bermutasi". Secara umum, pemicu tingkat baris pada tabel A (yaitu properties
) tidak dapat menanyakan tabel A. Anda dapat mengatasi masalah itu dengan membuat paket, membuat koleksi dalam paket itu, menginisialisasi koleksi di pemicu pernyataan sebelumnya, menulis kunci yang dimasukkan atau diperbarui ke dalam koleksi di pemicu tingkat baris , dan kemudian mengulangi elemen-elemen koleksi dalam pernyataan setelah memicu dan mengeluarkan DML yang sesuai terhadap tabel. Namun, ini melibatkan banyak bagian yang bergerak dan banyak kerumitan (meskipun kerumitannya berkurang jika Anda menggunakan 11g dan dapat menggunakan pemicu majemuk sebagai gantinya).
Selain itu, jika Anda mencoba menggunakan pemicu, Anda akan mengalami masalah di lingkungan multi-pengguna. Jika pengguna A menyisipkan baris dalam satu sesi dan pengguna B menyisipkan baris duplikat dalam sesi berbeda sebelum pengguna A melakukan, tidak ada pemicu sesi yang akan mendeteksi baris duplikat. Anda berpotensi dapat mengatasi masalah semacam ini dengan secara eksplisit mengunci baris di tabel induk untuk membuat serial sisipan ke dalam tabel (sengaja membuat aplikasi lebih lambat dan kurang terukur). Namun kendala akan menjadi solusi yang jauh lebih efisien dan praktis.
Semua itu dikatakan, jika Anda hanya melakukan penyisipan satu baris menggunakan INSERT ... VALUES
sintaks dan batasi diri Anda untuk satu sesi, pemicu Anda tampaknya berfungsi
SQL> ed
Wrote file afiedt.buf
1 create table Properties(
2 idProperties number(10) NOT NULL,
3 Address_FK number(20),
4 Ownership_FK number(20)
5* )
SQL> /
Table created.
SQL> CREATE OR REPLACE TRIGGER Check_Duplicate
2 before insert or update on properties
3 FOR each ROW
4
5 declare
6 v_dup number;
7
8 begin
9 select count(idProperties) INTO v_dup from properties where Address_FK=
:NEW.Address_FK and
10 Ownership_FK=:NEW.Ownership_FK;
11
12 if v_dup > 0 then
13 Raise_Application_Error (-20100, 'This property already exists. The inse
rt is cancelled.');
14 end if;
15 end;
16 /
Trigger created.
SQL> insert into properties values( 1, 10, 100 );
1 row created.
SQL> insert into properties values( 2, 10, 100 );
insert into properties values( 2, 10, 100 )
*
ERROR at line 1:
ORA-20100: This property already exists. The insert is cancelled.
ORA-06512: at "SCOTT.CHECK_DUPLICATE", line 9
ORA-04088: error during execution of trigger 'SCOTT.CHECK_DUPLICATE'