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] 替换为触发器的所有者)。
我正在构建一个 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] 替换为触发器的所有者)。