创建触发器以保存oracle中表的CONSTRAINTs更改

时间:2017-12-26 03:35:23

标签: oracle plsql triggers constraints

我想创建表来保存我的oracle数据库中的所有CONSTRAINTs更改, 所以我创建了这个表(表名,约束名,日期,模式,如[insert | update | delete])

.menu li {
  display: inline-block;
  padding: 10px;
  border: 1px solid #ccc;
}

.menu li a {
  text-decoration: none;
}

问题在于插入数据,

我在考虑在插入或更新或删除后在user_cons_columns创建触发器,

但我发现user_cons_columns是一个视图,我无法在其上创建触发器,

那我该怎么做呢?

或者我可以创建触发器的表来执行此操作???

谢谢.......

3 个答案:

答案 0 :(得分:0)

User_Cons_Columns是oracle中的元数据视图,您无法使用它来监视约束更改。

我认为,您可以使用此元数据视图:

article_no

它显示LAST_CHANGE列已更改哪个约束以及您可以使用它们的其他数据。

答案 1 :(得分:0)

我不知道我们是否可以在Oracle的数据字典表中创建DML TRIGGER,但这听起来不错。

我建议您在ALTER活动中创建DDL Trigger

首先,作为一次性活动,您可以将所有可用约束存储在CONS表中。

然后在trigger中,您可以使用这些条件来检查表和列是否已更改。

if (ora_sysevent = 'ALTER' and
ora_dict_obj_type = 'TABLE')
  then alter_column := 
ora_is_alter_column('FOO');
end if;

然后,您可以查询user_cons_columnsALL_CONSTRAINTSCONS - 无论您发现哪个与存储数据相关 - 都可以查找是否添加了新约束。如果确实添加或修改了它,请输入CONS或者更新它(使用MERGE语句)

答案 2 :(得分:0)

正如您所说,您无法在USER_CONS_COLUMNS上创建该类型的触发器:

SQL> create or replace trigger trg_myucc
  2  before insert
  3  on user_cons_columns
  4  begin
  5   null;
  6  end;
  7  /
create or replace trigger trg_myucc
                          *
ERROR at line 1:
ORA-25001: cannot create this trigger type on this type of view

为什么我们不尝试 INTREAD OF TRIGGER

SQL> create or replace trigger trg_myucc
  2  instead of insert
  3  on user_cons_columns
  4  for each row
  5  begin
  6    null;
  7  end;
  8  /
on user_cons_columns
   *
ERROR at line 3:
ORA-01031: insufficient privileges

好的,那也行不通。但是,是什么阻止我们在视图上创建视图,然后在新创建的视图上创建INSTEAD OF触发器?

SQL> create or replace view my_ucc as select * from user_cons_columns;

View created.

SQL> create or replace trigger trg_myucc
  2  instead of insert
  3  on my_ucc
  4  for each row
  5  begin
  6    null;
  7  end;
  8  /

Trigger created.

精细;现在你有办法做你应该做的事情。有关触发器的更多信息here