2015-04-20 3 views
0

Наше требование если 1 из имени столбца в таблице обновления нам нужно вставить имя столбца в другой таблице, поэтому я написал этот коднужно имя столбца, старое значение и новое значение в Trigger

CREATE OR REPLACE TRIGGER Test AFTER 
    UPDATE ON XX_table 
    FOR EACH Row 
    BEGIN FOR C IN 
    (SELECT column_name 
    FROM User_Tab_Columns 
    WHERE Upper(Table_Name) = 'XX_table_name' ORDER BY column_id ASC) 
    LOOP 
    IF Updating (c.column_name) 
    THEN 
    INSERT INTO Xx_Trigger_table (Rt_Id ,Updated_Column ,updated_status) VALUES(:Old.Rt_Id,C.Column_Name,'Y'); 
    END IF; 
END LOOP; 
END; 

Теперь клиенту нужно старое значения, а также новое значение в XX_Trigger_Table.I наклоняет Написать

INSERT INTO Xx_Trigger_table (Rt_Id ,Updated_Column ,updated_status,old_value, new_value) VALUES(:Old.Rt_Id,C.Column_Name,'Y',:old.c.column_name,:new.c.column_name); 

Пожалуйста, предложите мне некоторое представление о том, чтобы вставить новое и старое значение в таблице. Спасибо заранее.

+0

Это странное требование. Зачем вам нужно ** имя столбца ** в таблице аудита? Все, что вы хотели бы, чтобы измененные строки были вставлены в таблицу аудита с колонкой ** 'timestamp' **. –

+0

Ya Это странное требование клиента. Но нам нужно имя столбца для какой-либо другой цели транзакции. Было бы здорово, если бы вы могли мне помочь. – Girish

+2

Затем сообщите клиенту, что это не хороший дизайн. Для аудита существует много новых методов. ** «Fine Grained Auditing» ** - одна из хороших особенностей. Кроме того, старый подход триггера должен быть реализован так, как я предложил. Вам нужна таблица аудита со всеми столбцами, подобными базовой таблице, с дополнительными столбцами, такими как столбец идентификатора как ПК, столбец идентификатора, чтобы узнать, является ли это ** «вставкой, обновлением или удалением» ** и ** 'timestamp' ** колонка. –

ответ

0

Если вы будете следовать этому подходу, например, @Alex Poole, вам предлагается включить все столбцы, которые вы хотите зарегистрировать. См. Эту процедуру и ее результаты.

CREATE OR REPLACE TRIGGER Test1 AFTER 
    UPDATE ON TESTEMP 
    FOR EACH Row 
    BEGIN FOR C IN 
    (SELECT column_name 
    FROM User_Tab_Columns 
    WHERE Upper(Table_Name) = 'TESTEMP' ORDER BY column_id ASC) 
    LOOP 
    IF Updating (c.column_name) then 
    IF (c.column_name='EMPNO') then 
    INSERT INTO test_audit (col_name,old_val,new_val,upd_stat) VALUES (C.column_name,:Old.empno,:New.empno,'Y'); 
    ELSIF 
    (c.column_name='ENAME') then 
    INSERT INTO test_audit (col_name,old_val,new_val,upd_stat) VALUES (C.column_name,:Old.ENAME,:New.ENAME,'Y'); 
    ELSIF 
    (c.column_name='MGR') then 
    INSERT INTO test_audit (col_name,old_val,new_val,upd_stat) VALUES (C.column_name,:Old.MGR,:New.MGR,'Y'); 
    END IF; 
    END IF; 
END LOOP; 
END; 



SQL> select * from testemp; 

    EMPNO ENAME  JOB    MGR HIREDATE   SAL  COMM  DEPTNO 
---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 
     7369 SMITH  CLERK   7902 17-DEC-80  800     20 
     7499 ALLEN  SALESMAN  7698 20-FEB-81  1600  300   30 
     7521 WARD  SALESMAN  7698 22-FEB-81  1250  500   30 
     7566 JONES  MANAGER   7839 02-APR-81  2975     20 


SQL> select * from test_audit; 

no rows selected 

SQL> update testemp set empno=6677 , ename='JUPITER' where empno=1234; 

1 row updated. 

SQL> COMMIT; 

Commit complete. 

SQL> select * from test_audit; 

COL_NAME OLD_VAL NEW_VAL U 
---------- ---------- ---------- - 
EMPNO  1234  6677  Y 
ENAME  SMITH  JUPITER Y 
+0

Анидифицирует проблему с указанным выше кодом, если мы вносим какие-либо изменения в таблицу, тогда мы также должны внести изменения в триггер. – Girish

+0

Да, но как часто меняется структура таблицы? – anudeepks

Смежные вопросы