#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. Кто-нибудь может помочь с триггером обновления, поскольку он все еще не разобрался для меня?