觸發器是Oracle數據庫中特殊的存儲過程,當特定事件(如INSERT、UPDATE、DELETE或DDL操作)發生時自動執行。在Linux環境下,Oracle觸發器的使用邏輯與其他操作系統一致,但需注意跨平臺兼容性(避免使用特定于Windows的功能)。
觸發器主要分為兩類:
FOR EACH ROW子句,對受影響的每一行執行一次,適用于行級數據處理(如驗證單行數據合法性)。WHEN子句添加觸發條件,僅當條件滿足時觸發(如僅當更新salary列時觸發驗證)。CREATE TRIGGER權限(若在他人模式下創建,需CREATE ANY TRIGGER);OR REPLACE可修改現有觸發器(無需先刪除),避免重復創建錯誤;COMMIT/ROLLBACK)或大量數據處理,防止影響數據庫性能。-- 在employees表插入前驗證salary不為負
CREATE OR REPLACE TRIGGER check_salary_insert
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF :NEW.salary < 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'Salary cannot be negative');
END IF;
END;
/
-- 當employees表插入新員工時,自動插入到departments表(若部門不存在)
CREATE OR REPLACE TRIGGER sync_department
AFTER INSERT ON employees
FOR EACH ROW
DECLARE
v_dept_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_dept_count
FROM departments
WHERE department_id = :NEW.department_id;
IF v_dept_count = 0 THEN
INSERT INTO departments(department_id, department_name)
VALUES (:NEW.department_id, 'New Department');
END IF;
END;
/
-- 記錄employees表的修改日志(誰、何時、修改了什么)
CREATE TABLE emp_audit (
audit_id NUMBER GENERATED ALWAYS AS IDENTITY,
emp_id NUMBER,
changed_by VARCHAR2(30),
change_time TIMESTAMP,
operation VARCHAR2(10)
);
CREATE OR REPLACE TRIGGER log_emp_changes
AFTER INSERT OR UPDATE OR DELETE ON employees
BEGIN
IF INSERTING THEN
INSERT INTO emp_audit(emp_id, changed_by, change_time, operation)
VALUES (:NEW.employee_id, USER, SYSTIMESTAMP, 'INSERT');
ELSIF UPDATING THEN
INSERT INTO emp_audit(emp_id, changed_by, change_time, operation)
VALUES (:NEW.employee_id, USER, SYSTIMESTAMP, 'UPDATE');
ELSIF DELETING THEN
INSERT INTO emp_audit(emp_id, changed_by, change_time, operation)
VALUES (:OLD.employee_id, USER, SYSTIMESTAMP, 'DELETE');
END IF;
END;
/
ALTER TRIGGER check_salary_insert DISABLE;
ALTER TRIGGER check_salary_insert ENABLE;
USER_TRIGGERS視圖查詢:SELECT trigger_name, status FROM user_triggers WHERE trigger_name = 'CHECK_SALARY_INSERT';
使用DROP TRIGGER語句徹底刪除觸發器:
DROP TRIGGER check_salary_insert;
SELECT text FROM user_source WHERE name = 'CHECK_SALARY_INSERT' ORDER BY line;
SELECT ANY DICTIONARY權限):SELECT trigger_name, table_name, triggering_event, status
FROM all_triggers
WHERE owner = 'YOUR_SCHEMA';
DBMS_OUTPUT.PUT_LINE輸出調試信息(需開啟SERVEROUTPUT):CREATE OR REPLACE TRIGGER debug_trigger
BEFORE INSERT ON employees
BEGIN
DBMS_OUTPUT.PUT_LINE('Inserting into employees: ' || :NEW.employee_id);
END;
/
-- 執行前開啟輸出
SET SERVEROUTPUT ON;
INSERT INTO employees(employee_id, name, salary) VALUES (101, 'John Doe', 5000);
SHOW ERRORS命令:SHOW ERRORS TRIGGER check_salary_insert;
FOLLOWS/PRECEDES子句控制執行順序(Oracle 11g及以上版本支持)。通過以上技巧,可在Linux環境下高效使用Oracle觸發器,實現數據完整性維護、業務邏輯自動化等需求,同時避免潛在的性能與穩定性問題。