在没有细粒度审计的情况下审计包含许多列的表

时间:2016-03-26 16:36:52

标签: oracle plsql triggers

我必须为包含许多列的表创建一个触发器,我想现在是否有可能避免使用以下列之后的列名:new和:old。而不是专门使用列名我想使用集合中的元素与目标表的列名(设置触发器的表)。

第25行是绑定错误:

DBMS_OUTPUT.PUT_LINE('Updating customer id'||col_name(i)||to_char(:new.col_name(i)));

Bellow你可以看到我的触发器:

        CREATE OR REPLACE TRIGGER TEST_TRG BEFORE
      INSERT OR
      UPDATE ON ITEMS REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW DECLARE TYPE col_list IS TABLE OF VARCHAR2(60);
      col_name col_list := col_list();
      total   INTEGER;
      counter INTEGER :=0;
      BEGIN
        SELECT COUNT(*)
        INTO total
        FROM user_tab_columns
        WHERE table_name = 'ITEMS';
        FOR rec IN
        (SELECT column_name FROM user_tab_columns WHERE table_name = 'ITEMS'
        )
        LOOP
          col_name.extend;
          counter          :=counter+1;
          col_name(counter) := rec.column_name;
          dbms_output.put_line(col_name(counter));
        END LOOP;
        dbms_output.put_line(TO_CHAR(total));
        FOR i IN 1 .. col_name.count
        LOOP
        IF UPDATING(col_name(i)) THEN
        DBMS_OUTPUT.PUT_LINE('Updating customer id'||col_name(i)||to_char(:new.col_name(i)));
        END IF;
        END LOOP;
END;

此致,

2 个答案:

答案 0 :(得分:0)

在挖掘更多内容后,我发现无法在触发器中动态引用:new.column_name或:old.column_name值。因此,我将仅使用我的代码INSERT(它没有旧值:-(),我将在java中执行一些代码来生成UPDATE语句。

答案 1 :(得分:0)

我必须根据Justin Cave所说的内容以及我的发现来完善我以前的答案。我们可以根据引用子句(旧的和新的)创建由INSERTING和UPDATING触发的动态值列表。例如,我创建了2个带有varchars的嵌套表类型的集合。一个集合将包含所有列选项卡(作为字符串),我将用于审计,另一个集合将包含具有绑定引用的列的值(例如:new。)。在INSERTING谓词之后,我已经按字符串的集合(关联数组)创建了一个索引,其ID取自具有列选项卡名称的字符串列表,以及从new引用的列的值列表中获取的值。由于收集索引,您可以使用完整的工作动态列表。祝你好运:-)