Saya memiliki pemicu pembaruan di tabel Oracle saya..tetapi sepertinya itu tidak berfungsi..Skema di mana pemicu dan tabel yang dibuat adalah HR

CREATE OR REPLACE Trigger TR_FinlStatAssetDesignation_U
BEFORE update
on FINLSTATASSETDESIGNATION FOR EACH ROW
   DECLARE
   v_AtDateTime  TIMESTAMP(3);
   v_LogOperation  NUMBER(3,0);
   v_UserName  VARCHAR2(255);
   v_AppName  VARCHAR2(255);
   SWV_error NUMBER(10,0) DEFAULT 0;
BEGIN

   begin
      select USERNAME INTO v_UserName FROM v$session  WHERE (audsid = SYS_CONTEXT('userenv','sessionid')) AND ROWNUM <=1;
      EXCEPTION
      WHEN NO_DATA_FOUND THEN
         NULL;
   end;

   SELECT program INTO v_AppName FROM v$session WHERE audsid=userenv('sessionid'); 
   if (LENGTH(v_AppName) = 0) then 
      v_AppName := 'Unknown';
   end if; 

   SELECT SYSTIMESTAMP INTO v_AtDateTime FROM dual;

   if UPDATING('FinlStatAssetDesignation') then
      RAISE_APPLICATION_ERROR(-20000,'Invalid attempt to update OID FinlStatAssetDesignation in FinlStatAssetDesignation');
      /*    
      ROLLBACK */
      return;
   end if;

   if not UPDATING('UpdDate') then
      SWV_error := 0;
      begin
         UPDATE FinlStatAssetDesignation a SET(UpdDate) =(SELECT distinct v_AtDateTime FROM dual  where a.FinlStatAssetDesignation = :NEW.FinlStatAssetDesignation)
         WHERE ROWID IN(SELECT a.ROWID FROM FinlStatAssetDesignation a where a.FinlStatAssetDesignation = :NEW.FinlStatAssetDesignation);
         EXCEPTION
         WHEN OTHERS THEN
            SWV_error := SQLCODE;
      end;
      if SWV_error <> 0 then
         /* 
ROLLBACK */
return;

Dalam pemicu ini .. bagian kedua yaitu di bawah ini tidak berfungsi sebagai pemicu.. tolong bantu .... tidak memperbarui stempel waktu di kolom pembaruan

SQL> select * from finlstatassetdesignation;

FINLSTATAS FINLSTATASSETDESIGNATIONDESC                       UPDOPERATION
---------- -------------------------------------------------- ------------
UPDDATE
---------------------------------------------------------------------------
one19      anyt                                                          0
           hinh
01-JAN-17 08.00.00.000000 AM


SQL> update finlstatassetdesignation set finlstatassetdesignationdesc ='nothing';

1 row updated.

SQL> select * From finlstatassetdesignation;

FINLSTATAS FINLSTATASSETDESIGNATIONDESC                       UPDOPERATION
---------- -------------------------------------------------- ------------
UPDDATE
---------------------------------------------------------------------------
one19      nothing                                                       0
01-JAN-17 08.00.00.000000 AM
0
rock_techie 13 Maret 2019, 13:50

1 menjawab

Jawaban Terbaik

Apa yang ingin Anda capai di pemicu ON INSERT? Dari komentar Anda tentang

Saya masih dapat menyisipkan baris sebagai pengguna "halo"..maka pemicu tidak berfungsi..

Anda tampaknya ingin mencegah pengguna bernama HELLO ditambahkan - tetapi dalam kode pemicu Anda jika nama pengguna HELLO ditemukan, Anda cukup kembali dari pemicu. Itu tidak menyelesaikan apa pun. Untuk memberi sinyal ke sistem bahwa Anda tidak ingin INSERT melanjutkan, Anda harus memunculkan pengecualian di pemicu Anda. Sebagai contoh:

CREATE OR REPLACE Trigger TR_FinlStatAssetDesignation_I
  BEFORE Insert on FINLSTATASSETDESIGNATION
BEGIN
  if USER = 'HELLO' or USER = 'SYSTEM' then
    RAISE_APPLICATION_ERROR(-20000, 'Invalid user in TR_FinlStatAssetDesignation_I');
  end if;
END TR_FinlStatAssetDesignation_I;

Mengangkat pengecualian dengan cara ini akan mencegah INSERT melanjutkan ke penyelesaian yang berhasil. Kode Anda bertanggung jawab untuk menyediakan penangan kesalahan yang sesuai.

Semoga berhasil.

2
Bob Jarvis - Reinstate Monica 13 Maret 2019, 11:34