Триггер обновления SQL работает не так, как ожидалось

#oracle

#Oracle

Вопрос:

У меня есть триггер обновления в моей таблице oracle .. но, похоже, он не работает..Схема, в соответствии с которой создаются триггеры и таблица, — 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;
  

В этом триггере.. вторая часть, то есть приведенная ниже, не работает триггера..пожалуйста help….it не обновляется временная метка в столбце upddate

 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
  

Комментарии:

1. Не реализуйте бизнес-логику с помощью триггеров — это плохая практика.

2. select USERNAME INTO v_UserName FROM v$session WHERE (audsid = SYS_CONTEXT('userenv','sessionid')) AND ROWNUM <=1; может быть упрощен до v_username := user;

Ответ №1:

Чего вы пытаетесь достичь с помощью ON INSERT триггера? Из вашего комментария к

Я все еще могу вставить строку от имени пользователя «hello» .. следовательно, триггер не работает..

похоже, вы хотите запретить добавление пользователя с именем HELLO , но в вашем коде триггера, если найдено имя пользователя HELLO , вы просто возвращаетесь из триггера. Это ничего не дает. Чтобы сигнализировать системе, что вы не хотите, чтобы вставка продолжалась, вы должны вызвать исключение в вашем триггере. Например:

 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;
  

Создание исключения таким образом предотвратит успешное завершение вставки. Ваш код отвечает за предоставление соответствующего обработчика ошибок.

Желаю удачи.

Комментарии:

1. Вы также должны указать ДЛЯ КАЖДОЙ СТРОКИ. В противном случае это всего лишь триггер оператора

2. Кто-нибудь может помочь с триггером обновления, поскольку он все еще не разобрался для меня?