Postgres中TG_OP和TG_NAME的oracle等价物是什么?



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

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

但是,我找不到 Oracle 中与 Postgres 的tg_nametg_op等效的内容。

呵呵,据我所知,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.

触发器:不幸的是,我不知道是否有一个内置函数返回您正在使用的对象(在我们的例子中为表(的名称,所以我正在查询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.

和。。。行动!

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>

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

但是,如果要创建架构级别触发器,则可以使用预定义的属性 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 触发器

相关内容

  • 没有找到相关文章

最新更新