Teguh Susanto wrote:
>
> tapi kasus yg terjadi data master bisa terhapus walalupun masih 
> memiliki data transaksi dan kebetulan sy cek di log penghapusan data 
> itu terhapus oleh sistem
>
>
> 

 Bisa dijelaskan di sini, apa yang dimaksud dengan terhapus oleh sistem? 
Apakah tau2 terhapus begitu saja atau oleh sebuah prosedur yang sudah 
dibuat sebelumnya (misalnya via job, trigger, dsb)? Jika jawabannya yang 
pertama, bisa jadi itu adalah bug dari Oracle.


Sebenarnya ada kondisi dimana record di parent table bisa saja dihapus 
meskipun masih ada record di child table.
Case:

SQL> CREATE TABLE t_master (
  2  id NUMBER,
  3  name VARCHAR2(48),
  4  CONSTRAINT pk_id PRIMARY KEY (id));
Table created.

SQL> INSERT INTO t_master VALUES (1, 'satu');
1 row created.

SQL> SELECT * FROM t_master;
        ID NAME
---------- -----------------
         1 satu

SQL> CREATE TABLE t_child (
  2  child_name VARCHAR2(48),
  3  id NUMBER,
  4  CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES t_master (id));
Table created.

SQL> INSERT INTO t_child VALUES ('satu',1);
1 row created.

-- error karena child record ditemukan
SQL> DELETE FROM t_master
  2  WHERE id = 1;
DELETE FROM t_master
*
ERROR at line 1:
ORA-02292: integrity constraint (USER1.FK_ID) violated - child record found

SQL> ALTER TABLE t_child DISABLE CONSTRAINT fk_id;
Table altered.

-- tidak error karena foreign key sudah di-disable sebelumnya.
SQL> DELETE FROM t_master
  2  WHERE id = 1;
1 row deleted.

-- enable foreign key tanpa validasi record sebelumnya
SQL> ALTER TABLE t_child ENABLE NOVALIDATE CONSTRAINT fk_id;
Table altered.

SQL> SELECT * FROM t_master;
no rows selected

-- record ini gak punya parent
SQL> SELECT * FROM t_child;
CHILD_NAME                         ID
------------------------------ ----------
satu                                              1

SQL> INSERT INTO t_master VALUES (2,'dua');
1 row created.

SQL> INSERT INTO t_child VALUES ('dua',2);
1 row created.

-- tes apakah foriegn key sudah enable lagi
SQL> DELETE FROM t_master
  2  WHERE id = 2;
DELETE FROM t_master
*
ERROR at line 1:
ORA-02292: integrity constraint (USER1.FK_ID) violated - child record found

SQL> SELECT * FROM t_master;
        ID NAME
---------- ------------------------------------------------
         2 dua

-- ada record yang tidak mempunyai parent
SQL> SELECT * FROM t_child;
CHILD_NAME                          ID
------------------------------- ----------
satu                                               1
dua                                                2


CMIIW,
AH

Kirim email ke