Что эквивалентно Oracle TG_OP и TG_NAME в Postgres? - PullRequest
0 голосов
/ 23 сентября 2018

Я хочу создать триггер, который просто вставляет имя измененной таблицы и выполняемую над ней операцию.Вроде как:

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

Однако я не могу найти то, что эквивалентно в Oracle для tg_name и tg_op от Postgres.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Нет смысла иметь специальный атрибут для table_name и операции в триггере DML.Триггер DML может быть создан только на ОДНОЙ таблице, поэтому вы можете жестко указать его имя в самом триггере.Условные предикаты INSERTING, DELETING и 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;
/

PL / SQL триггеры

0 голосов
/ 23 сентября 2018

Да, насколько я могу судить, в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...