如何创建将记录表创建的Oracle事件触发器

问题描述 投票:0回答:2

我正在尝试编写一个触发器,该触发器在用户创建新表并将该表的创建记录到审核表后触发。

我有下面的入门代码:

CREATE OR REPLACE TRIGGER create_table_trigger
AFTER CREATE
ON SCHEMA
BEGIN
 INSERT INTO TABS_MODS (ID,ACTION) VALUES (1, 'CREATE TAB');
END;

TABS_MODS是如下所示的全局临时表:

CREATE GLOBAL TEMPORARY TABLE TABS_MODS (
  id NUMBER,
  action  VARCHAR2(20)
) ON COMMIT PRESERVE ROWS;

但是在创建表时,我没有在TABS_MODS表中看到任何内容。

oracle plsql database-trigger
2个回答
0
投票

使用Oracle的内置审计功能来执行此操作。审核“创建表”和“创建任何表”权限。您没有指定要使用的Oracle版本,但是可以从此处开始,并在需要时搜索更多特定于版本的示例:https://docs.oracle.com/database/121/DBSEG/auditing.htm


-1
投票

当您尝试创建触发器或尝试创建新表时,它是否显示错误?

我对您所做的过程进行了一些细微的更改,并且没有错误,如下所示:

-- Create table
create global temporary table TABS_MODS
(
  id       NUMBER,
  action   VARCHAR2(20),
  name     VARCHAR2(60),
  dtcreate DATE
)
on commit preserve rows;

创建触发器:

CREATE OR REPLACE TRIGGER LOG_CREATE
  AFTER CREATE ON SCHEMA

BEGIN
  IF ORA_DICT_OBJ_TYPE = 'TABLE' THEN
    INSERT INTO TABS_MODS
      (ID, ACTION, NAME, DTCREATE)
    VALUES
      (1, 'CREATE TAB', ORA_DICT_OBJ_NAME, SYSDATE);
  END IF;
END;

然后我创建了两个测试表并查询了表TABS_MODS中的数据:

CREATE TABLE TESTTABLE (ID NUMBER, NAME VARCHAR2(30));
CREATE TABLE TESTTABLE2 (ID NUMBER, NAME VARCHAR2 (30));

SELECT * FROM TABS_MODS;

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.