我想创建一个触发器,它只插入修改后的表的名称和对其执行的操作。就像这样:
BEGIN
INSERT INTO audit_table VALUES(user,tg_name,tg_op);
END;但是,我找不到在Oracle中与Postgres的tg_name和tg_op等同的是什么。
发布于 2018-09-23 14:45:03
嗯,据我所知,Oracle中没有那么简单的东西(但我承认-我可能错得很离谱,有人可能知道得更清楚)。无论如何,在更好的答案出现之前,这里有一些代码;看看它是否有帮助。
我正在创建一个test表和一个日志表(不过,我不确定您的日志表到底有多好;您不知道什么时候做了什么等,所以我至少自由地添加了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>发布于 2018-09-24 05:26:37
在DML触发器中为table_name和操作设置特殊属性是没有意义的。DML触发器只能在一个表上创建,因此您可以在触发器本身中硬编码其名称。条件谓词INSERTING、derive和UPDATING可用于派生操作名称。
但是,如果您想要创建模式级触发器,则可以使用预定义的属性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;
/https://stackoverflow.com/questions/52461766
复制相似问题