我正在尝试编写一个触发器,该触发器在用户创建新表并将该表的创建记录到审核表后触发。
我有下面的入门代码:
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的内置审计功能来执行此操作。审核“创建表”和“创建任何表”权限。您没有指定要使用的Oracle版本,但是可以从此处开始,并在需要时搜索更多特定于版本的示例:https://docs.oracle.com/database/121/DBSEG/auditing.htm
当您尝试创建触发器或尝试创建新表时,它是否显示错误?
我对您所做的过程进行了一些细微的更改,并且没有错误,如下所示:
-- 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;