Триггер обновления SQL не работает должным образом - PullRequest
0 голосов
/ 13 марта 2019

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

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

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 голосов
/ 13 марта 2019

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

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

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

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;

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

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...