ORA-01031报错主因是触发器体内SQL编译失败,非CREATE TRIGGER权限缺失;须显式授予序列、表、包等被引用对象的访问权限,且不可依赖角色权限,数据库级触发器还需ADMINISTER DATABASE TRIGGER权限。

CREATE TRIGGER 权限够了,但触发器一执行就报 ORA-01031?
不是 CREATE TRIGGER 缺权限,而是触发器体内的 SQL 在编译时找不到对象访问权限。Oracle 触发器以定义者(definer)身份编译,角色权限(比如通过 CONNECT 或自定义角色授予的权限)在编译阶段不生效——必须显式 GRANT 到用户本身。
常见现象:
- 手动执行
SELECT seq_name.NEXTVAL FROM DUAL没问题,放进触发器就报ORA-01031 - 触发器里写了
INSERT INTO other_user.t,但只授了CREATE TRIGGER,没授INSERT ON other_user.t - 用
SHOW ERRORS查触发器,看到PL/SQL: ORA-01031,错误位置在某条 SQL 行,而非CREATE TRIGGER那行
排查建议:
- 把触发器体中每条带 schema 前缀的语句单独拿出来,用同一用户执行一遍(如
SELECT test.seq_id.NEXTVAL FROM DUAL) - 确认所有被引用对象(表、序列、包、函数)的属主是否已执行
GRANT,且目标用户出现在TO your_user中 - 避免依赖角色:查
SELECT * FROM SESSION_ROLES,如果返回空,说明当前会话没激活角色,哪怕权限已授也无效;临时可用SET ROLE ALL,长期应设默认角色:ALTER USER your_user DEFAULT ROLE ALL
跨 Schema 创建触发器需要 CREATE ANY TRIGGER,但它不管运行时权限
如果你要建的是 CREATE OR REPLACE TRIGGER other_user.trg_xxx(即在别人 schema 下建),必须有 CREATE ANY TRIGGER 系统权限。但这只解决“能建”的问题,不解决“能跑”。
触发器内所有对象访问仍需独立授权:
-
SELECT ON other_user.t—— 如果触发器里查了对方的表 -
EXECUTE ON sys.dbms_job—— 如果调用了系统包 -
SELECT ON other_user.seq_name—— 如果用了对方的序列
注意:这些 GRANT 必须由对象属主(如 other_user)或具备 GRANT ANY OBJECT PRIVILEGE 的 DBA 执行,不能由你自己用 GRANT ... TO self 绕过。
Database-level trigger 报 ORA-01031?缺的是 ADMINISTER DATABASE TRIGGER
创建 CREATE TRIGGER ... ON DATABASE(即数据库级触发器)时,CREATE TRIGGER 或 CREATE ANY TRIGGER 都不够。它属于高危操作,需要专门的系统权限:
- 必须由 DBA 执行:
GRANT ADMINISTER DATABASE TRIGGER TO your_user - 该权限不能通过角色继承,必须显式授予用户
- 授予后仍需确保触发器体内引用的所有对象(如审计表、序列、包)也都已单独授权
触发器编译通过但运行时报 ORA-04098?可能是失效或被禁用
ORA-04098: trigger 'xxx' is invalid and failed re-validation 不代表权限问题,而是触发器处于 INVALID 或 DISABLED 状态。这类问题常被误判为权限不足。
快速检查:
- 查状态:
SELECT owner, trigger_name, status, triggering_event FROM dba_triggers WHERE trigger_name = 'TRG_PMS_CALCULATION_RESULTS_CHANGE' - 若
STATUS = 'DISABLED',执行:ALTER TRIGGER LZ_CS.TRG_PMS_CALCULATION_RESULTS_CHANGE ENABLE - 若
STATUS = 'INVALID',先查失效原因:SHOW ERRORS TRIGGER LZ_CS.TRG_PMS_CALCULATION_RESULTS_CHANGE,大概率是内部对象权限缺失或依赖对象被删/重命名
最易忽略的一点:触发器依赖的对象(比如一个视图)本身也可能是 INVALID 的,导致连锁失效。得一层层顺藤摸瓜查 dba_objects 里的 STATUS。


















