【问题标题】:Auditing a table with many columns without Fine Grained Auditing在没有细粒度审计的情况下审计具有许多列的表
【发布时间】:2016-07-14 06:28:08
【问题描述】:

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

第25行是绑定错误:

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

下面你可以看到我的触发器:

        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;

此致,

【问题讨论】:

  • 不,不是。根据您要完成的工作,您可能会编写一些代码,根据数据字典动态构建您想要的触发器。
  • 我想使用触发器来创建一个审计表,其中每列的记录都已更改。
  • 你能给我发一个例子的链接吗,请。

标签: oracle plsql triggers


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-06-02
      • 2011-12-07
      • 1970-01-01
      • 2012-10-26
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      相关资源
      最近更新 更多