在Postgres中,Oracle的TG_OP和TG_NAME相当于什么?

时间:2018-09-22 23:37:17

标签: oracle plsql audit database-trigger

我想创建一个触发器,该触发器仅插入修改后的表的名称以及对其执行的操作。有点像:

 BEGIN
   INSERT INTO audit_table VALUES(user,tg_name,tg_op);
 END;

但是我找不到Oracle中与Postgres的tg_nametg_op等效的东西。

2 个答案:

答案 0 :(得分:1)

据我所知,Oracle中没有什么比这简单的了(但我承认-我可能错了,有人可能知道得更多)。无论如何,在给出更好的答案之前,这里需要进行一些编码。看看是否有帮助。

我正在创建一个测试表和一个日志表(尽管,我不确定您的日志表实际上;您不知道何时完成操作等,所以-我可以自由地添加至少DATE列)。

SQL> create table test as select * From dept;

Table created.

SQL> create table test_log
  2    (username   varchar2(30),
  3     c_date     date,
  4     table_name varchar2(30),
  5     action     varchar2(1));

Table created.

一个触发器:不幸的是,我不知道是否有一个内置函数返回您正在处理的对象(在我们的例子中是一个表)的名称,所以我要查询{{1} }。

USER_OBJECTS

然后...行动!

SQL> create or replace trigger trg_test_log
  2    after insert or update or delete on test
  3    for each row
  4  declare
  5    l_table_name varchar2(30);
  6    l_action     varchar2(1);
  7  begin
  8    select object_name
  9      into l_table_name
 10      from user_objects
 11      where object_id = dbms_rowid.rowid_object(nvl(:new.rowid, :old.rowid));
 12
 13    if inserting then
 14       l_action := 'I';
 15    elsif updating then
 16       l_action := 'U';
 17    elsif deleting then
 18       l_action := 'D';
 19    end if;
 20
 21    insert into test_log (username, c_date, table_name, action)
 22      values (user, sysdate, l_table_name, l_action);
 23  end;
 24  /

Trigger created.

答案 1 :(得分:0)

在DML触发器中为table_name和操作具有特殊属性毫无意义。 DML触发器只能在ONE表上创建,因此您可以在触发器本身中对其名称进行硬编码。 条件谓词“插入”,“删除”和“更新”可用于导出操作名称。

但是,如果要创建模式级别触发器,则可以使用预定义的属性ora _ *。

create table audit_table
(
  user_name varchar2(30),
  table_name varchar2(30),
  action varchar2(30)
);

create or replace trigger schema_trigger
before create or alter
on schema
begin
  insert into audit_table
    (user_name, table_name, action)
  values
    (ora_login_user, ora_dict_obj_name, ora_sysevent);
end schema_trigger;
/

PL/SQL Triggers