Oracle和MySQL这两个具体有什么表级触发器 给个具体的使用例子
时间: 2024-11-03 16:19:23 浏览: 19
Oracle和MySQL虽然都支持表级触发器,但它们的具体语法和用途略有差异。
在Oracle中,表级触发器(Table-Level Trigger)一般用于在数据插入、删除或修改整个表时执行某些操作。例如,你可以创建一个表级触发器来记录所有表的变化历史:
```sql
CREATE TRIGGER log_table_changes
AFTER INSERT OR UPDATE OR DELETE ON your_table
FOR EACH ROW
BEGIN
INSERT INTO audit_log (operation_type, old_data, new_data)
VALUES (:OLD.operation, :OLD.data, :NEW.data);
END;
```
在这个例子中,每当`your_table`中的行发生变化,触发器会将操作类型(INSERT, UPDATE或DELETE)、旧数据和新数据插入到审计日志表`audit_log`中。
在MySQL中,表级触发器也称为事件(Event),其语法更为复杂,通常在InnoDB存储引擎上使用。由于MySQL默认不启用触发器,需要开启它才能创建表级事件。例如,创建一个记录表变化的事件可以这样写:
```sql
DELIMITER //
CREATE EVENT log_events
ON SCHEDULE EVERY 1 DAY
DO
BEGIN
INSERT INTO audit_log (operation, table_name, changed_column, old_value, new_value)
SELECT 'INSERT', TABLE_NAME, column_name, OLD.column_name, NEW.column_name
FROM information_schema.tables t JOIN
inserted i ON t.table_name = i.table_name
LEFT JOIN deleted d ON i.insert_id = d.delete_id
WHERE t.table_name = 'your_table';
INSERT INTO audit_log (operation, table_name, column_name, old_value, new_value)
SELECT 'UPDATE', TABLE_NAME, column_name, OLD.column_name, NEW.column_name
FROM information_schema.tables t JOIN
updated u ON t.table_name = u.table_name
LEFT JOIN deleted d ON u.update_rows = d.delete_rows
WHERE t.table_name = 'your_table';
INSERT INTO audit_log (operation, table_name, column_name, old_value, new_value)
SELECT 'DELETE', TABLE_NAME, column_name, OLD.column_name, NULL
FROM information_schema.tables t JOIN
deleted d ON t.table_name = d.table_name;
END; //
DELIMITER ;
```
这个MySQL事件会在每天执行一次,记录当天对`your_table`的所有更改。
阅读全文