ORA-04072: Invalid Trigger Type — Causes, Fixes & Prevention
ORA-04072 is thrown by Oracle Database when a trigger is created or altered with an invalid or unsupported trigger type. This typically means the trigger timing keyword (BEFORE, AFTER, INSTEAD OF) is either misspelled, misused, or applied to an incompatible database object. Understanding the rules around Oracle trigger types is essential to resolving this error quickly.
Top 3 Causes
1. Applying INSTEAD OF Trigger to a Table (Not a View)
The INSTEAD OF trigger type is exclusively for views. Attempting to create one on a regular table immediately raises ORA-04072.
-- ❌ WRONG: INSTEAD OF on a regular table
CREATE OR REPLACE TRIGGER trg_bad_example
INSTEAD OF INSERT ON employees -- "employees" is a TABLE, not a VIEW
FOR EACH ROW
BEGIN
NULL;
END;
/
-- Result: ORA-04072: invalid trigger type
-- ✅ CORRECT: Create a view first, then apply INSTEAD OF
CREATE OR REPLACE VIEW v_emp AS
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE department_id = 10;
CREATE OR REPLACE TRIGGER trg_v_emp_ins
INSTEAD OF INSERT ON v_emp -- Applied to a VIEW ✓
FOR EACH ROW
BEGIN
INSERT INTO employees (employee_id, first_name, last_name, salary)
VALUES (:NEW.employee_id, :NEW.first_name, :NEW.last_name, :NEW.salary);
END;
/
2. Misspelled or Invalid Trigger Type Keyword
A simple typo in BEFORE, AFTER, or INSTEAD OF will cause the Oracle parser to fail with ORA-04072. This is especially common when migrating scripts from other databases (MySQL, SQL Server).
-- ❌ WRONG: Typo in trigger type keyword
CREATE OR REPLACE TRIGGER trg_salary_check
BEFOR UPDATE ON employees -- Typo: should be "BEFORE"
FOR EACH ROW
BEGIN
IF :NEW.salary < 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'Salary cannot be negative.');
END IF;
END;
/
-- Result: ORA-04072: invalid trigger type
-- ✅ CORRECT: Proper keyword usage
CREATE OR REPLACE TRIGGER trg_salary_check
BEFORE UPDATE ON employees -- Correct keyword ✓
FOR EACH ROW
BEGIN
IF :NEW.salary < 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'Salary cannot be negative.');
END IF;
END;
/
3. Malformed Compound Trigger Declaration
Oracle 11g+ supports Compound Triggers, which combine multiple timing points in a single trigger body. Incorrectly declaring the structure or mixing up timing sections triggers ORA-04072.
-- ❌ WRONG: Missing COMPOUND keyword
CREATE OR REPLACE TRIGGER trg_emp_bad
FOR INSERT OR UPDATE ON employees -- Missing "COMPOUND TRIGGER"
BEFORE STATEMENT IS
BEGIN
NULL;
END BEFORE STATEMENT;
END;
/
-- ✅ CORRECT: Proper compound trigger structure
CREATE OR REPLACE TRIGGER trg_emp_compound
FOR INSERT OR UPDATE ON employees
COMPOUND TRIGGER -- Required keyword ✓
v_count NUMBER := 0;
BEFORE STATEMENT IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Statement starting at: ' || TO_CHAR(SYSDATE,'HH24:MI:SS'));
END BEFORE STATEMENT;
AFTER EACH ROW IS
BEGIN
v_count := v_count + 1;
END AFTER EACH ROW;
AFTER STATEMENT IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Rows affected: ' || v_count);
END AFTER STATEMENT;
END trg_emp_compound;
/
Quick Fix Solutions
Step 1 — Verify the target object type before creating a trigger:
-- Check whether the target is a TABLE or VIEW
SELECT object_name, object_type, status
FROM user_objects
WHERE object_name = UPPER('YOUR_OBJECT_NAME')
AND object_type IN ('TABLE', 'VIEW');
Step 2 — Review existing triggers for errors:
-- List all triggers with their type and status
SELECT trigger_name, trigger_type, triggering_event,
table_name, status
FROM user_triggers
ORDER BY trigger_name;
-- Check for compilation errors on triggers
SELECT name, line, text
FROM user_errors
WHERE type = 'TRIGGER'
ORDER BY name, line;
Step 3 — Re-enable triggers after fixes:
-- Enable a specific trigger
ALTER TRIGGER trg_salary_check ENABLE;
-- Enable all triggers on a table
ALTER TABLE employees ENABLE ALL TRIGGERS;
Prevention Tips
1. Enforce a trigger naming and typing standard. Always document whether the target object is a table or view in the trigger header comment, and mandate code reviews before deploying any DDL trigger scripts to production.
2. Use a pre-deployment validation script to catch invalid trigger types before they hit production:
-- Detect invalid or disabled triggers proactively
SELECT trigger_name, status, trigger_type, table_name
FROM user_triggers
WHERE status = 'DISABLED'
UNION ALL
SELECT name, 'COMPILE ERROR', 'N/A', 'N/A'
FROM user_errors
WHERE type = 'TRIGGER';
Related Oracle Errors
| Error Code | Description |
|---|---|
| ORA-04071 | Missing BEFORE, AFTER, or INSTEAD OF keyword |
| ORA-04073 | Column list not valid for this trigger type |
| ORA-04074 | Invalid REFERENCING name |
| ORA-25002 | Cannot create INSTEAD OF triggers on tables |
| ORA-04079 | Invalid trigger specification |
Always check ORA-04071 and ORA-25002 alongside ORA-04072, as they often appear together when trigger syntax is incorrect.
📖 Want a more detailed guide?
Check out the full in-depth version (Korean) on oraerror.com — includes detailed analysis, additional SQL examples, and prevention tips.
Top comments (0)