Melakukan Sinkronisasi Data Dua Tabel yang Berada Pada Database yang Terpisah

Untuk melakukan hal ini, Kita bisa memanfaatkan trigger [1],  DBLink  [2] dan Function [3]. Berikut adalah contohnya : 

CREATE EXTENSION dblink; 
CREATE LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION sync_employeea_all() RETURNS trigger AS $$
BEGIN
  IF tg_op = 'DELETE' THEN
     perform dblink_connect('dbname=mdm host=localhost user=mdm password=rahasia');
     perform dblink_exec('DELETE FROM employee_all WHERE id='||OLD.id||' ;');
     perform dblink_disconnect();     
     RETURN OLD;
  END IF;
  IF tg_op = 'INSERT' THEN
     perform dblink_connect('dbname=mdm host=localhost user=mdm password=rahasia');
     perform dblink_exec('INSERT INTO employee_all(id, org_unit_code, employee_id, other_id, fullname,
                                   gelar_depan, gelar_belakang, nickname, gender, placeofbirth,
                                   dateofbirth, pension_date, maritalstatusid, karpeg, karis,
                                   askes, taspen, npwp, nation_id, myaddress, kal_id, kec_id, 
                                   kode_kota, province_code, country_code, postal_code, 
                                   rt, rw, phone, email, fax, mobile, height, weight, blood_id,
                                   hair_id, face_id, skin_id, disability, characteristic, 
                                   hoby, employed_date, status_id, emp_type, tipe_pegawai, 
                                   tipe_pegawai_status, functional, picturefile, die_date, 
                                   non_active, modified_by, modified_date, agama_id, 
                                   email_standard, email_tambahan, email_pribadi, question_id, 
                                   answer, role_id, username, nip, status, picturefile2, 
                                   status_sivitas_id, status_aktif_sivitas_id)
                 VALUES('||NEW.id||', '''||NEW.org_unit_code||''', '''||NEW.employee_id||''', '''||NEW.other_id||''', '''||NEW.fullname||''', 
                        '''||NEW.gelar_depan||''', '''||NEW.gelar_belakang||''', '''||NEW.nickname||''', '''||NEW.gender||''', '''||NEW.placeofbirth||''', 
                        '''||NEW.dateofbirth||''', '''||NEW.pension_date||''', '''||NEW.maritalstatusid||''', '''||NEW.karpeg||''', '''||NEW.karis||''',
                        '''||NEW.askes||''', '''||NEW.taspen||''', '''||NEW.npwp||''', '''||NEW.nation_id||''', '''||NEW.myaddress||''', '''||NEW.kal_id||''', '''||NEW.kec_id||''', 
                        '''||NEW.kode_kota||''', '''||NEW.province_code||''', '''||NEW.country_code||''', '''||NEW.postal_code||''', 
                        '''||NEW.rt||''', '''||NEW.rw||''', '''||NEW.phone||''', '''||NEW.email||''', '''||NEW.fax||''', '''||NEW.mobile||''', '''||NEW.height||'''
                        , '''||NEW.weight||''', '''||NEW.blood_id||''',
                        '||NEW.hair_id||', '||NEW.face_id||', '||NEW.skin_id||', '''||NEW.disability||''', '''||NEW.characteristic||''', 
                        '''||NEW.hoby||''', '''||NEW.employed_date||''', '''||NEW.status_id||''', '''||NEW.emp_type||''', '''||NEW.tipe_pegawai||''', 
                        '''||NEW.tipe_pegawai_status||''', '''||NEW.functional||''', '''||NEW.picturefile||''', '''||NEW.die_date||''', 
                        '''||NEW.non_active||''', '''||NEW.modified_by||''', '''||NEW.modified_date||''', '||NEW.agama_id||', 
                        '''||NEW.email_standard||''', '''||NEW.email_tambahan||''', '''||NEW.email_pribadi||''', '||NEW.question_id||', 
                        '''||NEW.answer||''', '||NEW.role_id||', '''||NEW.username||''', '''||NEW."NIP"||''', '''||NEW.status||''', '''||NEW.picturefile2||''', 
                        '||NEW.status_sivitas_id||', '||NEW.status_aktif_sivitas_id||');');
     perform dblink_disconnect();       
     RETURN NEW;
  END IF;
  IF tg_op = 'UPDATE' THEN
     perform dblink_connect('dbname=mdm host=localhost user=mdm password=rahasia');
     perform dblink_exec('UPDATE employee_all 
          SET id='||NEW.id||', 
          org_unit_code='''||NEW.org_unit_code||''', 
          employee_id='''||NEW.employee_id||''', 
          other_id='''||NEW.other_id||''', 
          fullname='''||NEW.fullname||''',
          gelar_depan='''||NEW.gelar_depan||''', 
          gelar_belakang='''||NEW.gelar_belakang||''', 
          nickname='''||NEW.nickname||''', 
          gender='''||NEW.gender||''', 
          placeofbirth='''||NEW.placeofbirth||''',
          dateofbirth='''||NEW.dateofbirth||''', 
          pension_date='''||NEW.pension_date||''', 
          maritalstatusid='''||NEW.maritalstatusid||''', 
          karpeg='''||NEW.karpeg||''', 
          karis='''||NEW.karis||''',
          askes='''||NEW.askes||''', 
          taspen='''||NEW.taspen||''', 
          npwp='''||NEW.npwp||''', 
          nation_id='''||NEW.nation_id||''', 
          myaddress='''||NEW.myaddress||''', 
          kal_id='''||NEW.kal_id||''', 
          kec_id='''||NEW.kec_id||''', 
          kode_kota='''||NEW.kode_kota||''', 
          province_code='''||NEW.province_code||''', 
          country_code='''||NEW.country_code||''', 
          postal_code='''||NEW.postal_code||''', 
          rt='''||NEW.rt||''', 
          rw='''||NEW.rw||''', 
          phone='''||NEW.phone||''', 
          email='''||NEW.email||''', 
          fax='''||NEW.fax||''', 
          mobile='''||NEW.mobile||''', 
          height='''||NEW.height||''', 
          weight='''||NEW.weight||''', 
          blood_id='''||NEW.blood_id||''',
          hair_id='||NEW.hair_id||', 
          face_id='||NEW.face_id||', 
          skin_id='||NEW.skin_id||', 
          disability='''||NEW.disability||''', 
          characteristic='''||NEW.characteristic||''', 
          hoby='''||NEW.hoby||''', 
          employed_date='''||NEW.employed_date||''', 
          status_id='''||NEW.status_id||''', 
          emp_type='''||NEW.emp_type||''', 
          tipe_pegawai='''||NEW.tipe_pegawai||''', 
          tipe_pegawai_status='''||NEW.tipe_pegawai_status||''', 
          functional='''||NEW.functional||''', 
          picturefile='''||NEW.picturefile||''', 
          die_date='''||NEW.die_date||''',
          non_active='''||NEW.non_active||''', 
          modified_by='''||NEW.modified_by||''', 
          modified_date='''||NEW.modified_date||''', 
          agama_id='||NEW.agama_id||',
          email_standard='''||NEW.email_standard||''', 
          email_tambahan='''||NEW.email_tambahan||''', 
          email_pribadi='''||NEW.email_pribadi||''', 
          question_id='||NEW.question_id||',
          answer='''||NEW.answer||''', 
          role_id='||NEW.role_id||', 
          username='''||NEW.username||''', 
          nip='''||NEW."NIP"||''', 
          status='''||NEW.status||''', 
          picturefile2='''||NEW.picturefile2||''', 
          status_sivitas_id='||NEW.status_sivitas_id||', 
          status_aktif_sivitas_id='||NEW.status_aktif_sivitas_id||'
      WHERE id='||OLD.id||' ;');
     perform dblink_disconnect();            
     RETURN new;
  END IF;
END; $$ LANGUAGE plpgsql;


DROP TRIGGER IF EXISTS sinkronisasi_employee_all ON  employee_all ;

CREATE TRIGGER sinkronisasi_employee_all AFTER INSERT OR DELETE OR UPDATE
    ON employee_all FOR EACH ROW
    EXECUTE PROCEDURE sync_employeea_all();


Referensi

  1. Trigger di PostgreSQL 9.1, http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html
  2. Cara Menggunakan DBLink di PostgreSQL, http://workshop.openthinklabs.com/resources/sistem-basis-data-database/postgresql-bootcamp/buku-masak/bagaimana-cara-menggunakan-fitur-database-link-di-postgresql
  3. Function di PostgreSQL 9.1, http://www.postgresql.org/docs/9.1/static/sql-createfunction.html

Comments