Sử dụng trigger để audit database trong Oracle là một phương pháp hiệu quả để giám sát và ghi lại các thay đổi đối với dữ liệu trong các bảng. Trigger có thể được sử dụng để tự động ghi lại thông tin về các thao tác như INSERT, UPDATE, và DELETE vào một bảng audit. Dưới đây là các bước chi tiết để cấu hình và sử dụng trigger để audit database.
1. Tạo Bảng và bảng lưu giá trị Audit
Trước tiên, bạn cần tạo một bảng để lưu trữ các bản ghi audit. Bảng này sẽ chứa các thông tin cần thiết như tên người dùng, thời gian thao tác, loại thao tác (INSERT, UPDATE, DELETE), và các giá trị cũ và mới của các cột được thay đổi.
## bảng data:
CREATE TABLE employees (
employee_id NUMBER(6) PRIMARY KEY,
first_name VARCHAR2(20),
last_name VARCHAR2(25) NOT NULL,
email VARCHAR2(25) NOT NULL,
phone_number VARCHAR2(20),
hire_date DATE NOT NULL,
job_id VARCHAR2(10) NOT NULL,
salary NUMBER(8, 2),
manager_id NUMBER(6),
department_id NUMBER(4)
);
## bảng lưu giá trị audit
CREATE TABLE employees_audit (
audit_id NUMBER PRIMARY KEY,
employee_id NUMBER,
action VARCHAR2(10),
old_first_name VARCHAR2(50),
new_first_name VARCHAR2(50),
old_last_name VARCHAR2(50),
new_last_name VARCHAR2(50),
changed_by VARCHAR2(30),
changed_on DATE
);
2. Tạo Trigger
Tiếp theo, bạn tạo các trigger để tự động ghi lại các thao tác INSERT, UPDATE, và DELETE trên bảng employees.
Trigger cho thao tác INSERT
CREATE OR REPLACE TRIGGER trg_employees_insert AFTER INSERT ON employees FOR EACH ROW BEGIN INSERT INTO employees_audit (audit_id, employee_id, action, new_first_name, new_last_name, changed_by, changed_on) VALUES (employees_audit_seq.NEXTVAL, :NEW.employee_id, 'INSERT', :NEW.first_name, :NEW.last_name, USER, SYSDATE); END; /
Trigger cho thao tác UPDATE
CREATE OR REPLACE TRIGGER trg_employees_update AFTER UPDATE ON employees FOR EACH ROW BEGIN INSERT INTO employees_audit (audit_id, employee_id, action, old_first_name, new_first_name, old_last_name, new_last_name, changed_by, changed_on) VALUES (employees_audit_seq.NEXTVAL, :OLD.employee_id, 'UPDATE', :OLD.first_name, :NEW.first_name, :OLD.last_name, :NEW.last_name, USER, SYSDATE); END; /
Trigger cho thao tác DELETE
CREATE OR REPLACE TRIGGER trg_employees_delete AFTER DELETE ON employees FOR EACH ROW BEGIN INSERT INTO employees_audit (audit_id, employee_id, action, old_first_name, old_last_name, changed_by, changed_on) VALUES (employees_audit_seq.NEXTVAL, :OLD.employee_id, 'DELETE', :OLD.first_name, :OLD.last_name, USER, SYSDATE); END; /
3. Tạo Sequence cho audit_id
Sequence giúp tạo ra các giá trị duy nhất cho cột audit_id trong bảng audit.
CREATE SEQUENCE employees_audit_seq
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
4. Kiểm tra Hoạt động của Trigger
Thực hiện một số thao tác trên bảng employees và kiểm tra các bản ghi audit trong bảng employees_audit.
INSERT INTO employees (employee_id, first_name, last_name, email, job_id, hire_date) VALUES (102, ‘John’, ‘Doe’,’duongnv@gmail.com’,’33’,sysdate);
UPDATE employees SET first_name = ‘Jane NANNA’ WHERE employee_id = 102;
DELETE FROM employees WHERE employee_id = 102;
DELETE FROM employees WHERE employee_id = 101;
Kiểm tra các bản ghi audit
SELECT * FROM employees_audit;