ORA-00942 错误时 运行 代码创建从数据字典视图插入行的触发器

ORA-00942 error when running code to create trigger that inserts rows from data dictionary views

我正在构建一个 table,它会在构建 table 后立即接收 table/view 名称、创建日期和创建者的姓名。我已经编写了一个触发器来执行相同的操作,它使用插入语句并从 user_objects、user_tables 和 v$session 中获取所需的数据。但是,当我 运行 触发器时,出现 "PL/SQL: ORA-00942: table or view does not exist" 错误。

CREATE OR REPLACE TRIGGER CREATE_TRIGGER
AFTER CREATE ON SCHEMA
BEGIN
 INSERT INTO NEW_OBJ_TRACKER (TBL_OR_VW_NAME, CREATED_DATE_TIME, LAST_QUERIED_DATE, CREATOR)
SELECT T4.* , T5.* FROM
 (
 SELECT OBJECT_NAME, CREATED, LAST_ANALYZED
 FROM SYS.USER_OBJECTS T1 LEFT JOIN SYS.USER_TABLES T2
 ON T1.OBJECT_NAME = T2.TABLE_NAME
 ORDER BY CREATED DESC
 ) T4,
 (
 SELECT OSUSER
 FROM SYS.v$session
 ORDER BY SQL_EXEC_START
 ) T5
 WHERE ROWNUM = 1
 ;
 END;
/

当我 运行 只是插入语句时,我没有收到任何错误,结果也很好。

您的触发器正在查询 sys.v$session。 v$ table 的权限是通过角色授予的,不能从过程、函数或触发器中使用。

为了让您的触发器能够查询 v$ table,您需要将其直接授予触发器的所有者,例如(运行 这作为 SYS):

grant select on v_$session to [user];

(将 [user] 替换为触发器的所有者)。