首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Postgres中,什么是TG_OP和TG_NAME的Oracle等价物?

在Postgres中,什么是TG_OP和TG_NAME的Oracle等价物?
EN

Stack Overflow用户
提问于 2018-09-23 07:37:17
回答 2查看 413关注 0票数 0

我想创建一个触发器,它只插入修改后的表的名称和对其执行的操作。就像这样:

代码语言:javascript
复制
 BEGIN
   INSERT INTO audit_table VALUES(user,tg_name,tg_op);
 END;

但是,我找不到在Oracle中与Postgres的tg_nametg_op等同的是什么。

EN

回答 2

Stack Overflow用户

发布于 2018-09-23 14:45:03

嗯,据我所知,Oracle中没有那么简单的东西(但我承认-我可能错得很离谱,有人可能知道得更清楚)。无论如何,在更好的答案出现之前,这里有一些代码;看看它是否有帮助。

我正在创建一个test表和一个日志表(不过,我不确定您的日志表到底有多好;您不知道什么时候做了什么等,所以我至少自由地添加了DATE列)。

代码语言:javascript
复制
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.

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

代码语言:javascript
复制
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.

还有..。开始!

代码语言:javascript
复制
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select * From test;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL> delete from test where deptno = 40;

1 row deleted.

SQL> update test set loc = 'CROATIA' where deptno = 10;

1 row updated.

SQL> insert into test (deptno, dname, loc) values (99, 'STACK', 'OVERFLOW');

1 row created.

SQL> select * From test;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     CROATIA
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        99 STACK          OVERFLOW

SQL> select * From test_log;

USERNAME                       C_DATE              TABLE_NAME                     A
------------------------------ ------------------- ------------------------------ -
SCOTT                          23.09.2018 08:44:17 TEST                           D
SCOTT                          23.09.2018 08:44:17 TEST                           U
SCOTT                          23.09.2018 08:44:17 TEST                           I

SQL>
票数 1
EN

Stack Overflow用户

发布于 2018-09-24 05:26:37

在DML触发器中为table_name和操作设置特殊属性是没有意义的。DML触发器只能在一个表上创建,因此您可以在触发器本身中硬编码其名称。条件谓词INSERTING、derive和UPDATING可用于派生操作名称。

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

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52461766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档