当前位置: 首页 > news >正文

如何创建语句级触发器_表级操作监控与日志记录实现

语句级触发器在整条DML语句执行完毕后触发一次,不依赖行数;关键区别在于它不可访问:NEW/:OLD,仅能用INSERTING/UPDATING/DELETING和SQL%ROWCOUNT,且必须显式声明FOR EACH STATEMENT。什么是语句级触发器:和行级触发器的关键区别语句级触发器在整条 insert、update 或 delete 语句执行完毕后触发一次,不管它影响了多少行;而行级触发器对每一行都触发一次。如果你只想记录“谁在什么时候执行了哪条修改语句”,而不是“哪几行被改了”,就必须用语句级——否则日志会爆炸式膨胀,还可能因 :new/:old 在语句级不可用而报 ora-04082: reference to a column in a trigger is not allowed。常见错误现象:– 在 BEFORE STATEMENT 里写 IF :NEW.id IS NOT NULL THEN ...– 把本该用 AFTER STATEMENT 记录操作元信息(如 USER、SYSDATE、SQL%ROWCOUNT)的逻辑,错放到行级触发器里语句级触发器中不能访问 :NEW 和 :OLD,只可读 INSERTING / UPDATING / DELETING 布尔变量想记录影响行数?用 SQL%ROWCOUNT,但它必须在触发器体中立即读取(不能放在函数调用后再查)Oracle 12c+ 支持 DBMS_UTILITY.FORMAT_CALL_STACK,但语句级触发器里拿不到调用 SQL 文本,别白费劲怎么写一个最小可用的语句级审计触发器核心是声明 FOR EACH STATEMENT,并用 AFTER 阶段保证操作已提交(或回滚)完成,日志才落盘。别用 BEFORE——它无法反映最终是否成功,且容易因异常中断导致日志缺失。示例:监控 orders 表的 DML 操作CREATE OR REPLACE TRIGGER log_orders_statement AFTER INSERT OR UPDATE OR DELETE ON orders FOR EACH STATEMENTDECLARE v_op VARCHAR2(10); v_rows NUMBER := SQL%ROWCOUNT;BEGIN IF INSERTING THEN v_op := 'INSERT'; ELSIF UPDATING THEN v_op := 'UPDATE'; ELSIF DELETING THEN v_op := 'DELETE'; END IF; INSERT INTO audit_log (table_name, operation, op_user, op_time, rows_affected) VALUES ('orders', v_op, USER, SYSDATE, v_rows);END;必须显式声明 FOR EACH STATEMENT,漏写就默认变成行级SQL%ROWCOUNT 在触发器体第一行就读,避免被后续 INSERT 覆盖日志表 audit_log 的 rows_affected 字段建议用 NUMBER,别用 VARCHAR2 存数字字符串为什么触发器没生效:权限与启用状态检查清单即使语法全对,语句级触发器也可能静默失效。最常被忽略的是:触发器本身被禁用,或者创建者没有 CREATE ANY TRIGGER 权限导致依赖对象(如日志表)不可见。 跃问 跃问是由阶跃星辰开发的免费AI智能问答助手,随时帮你智能搜索、高效阅读、识图理解、和你畅聊感兴趣的话题。

http://www.jsqmd.com/news/654559/

相关文章:

  • 2026信息安全就业方向+前景(超详细)|小白入门到精通,收藏永不会踩坑
  • Python学习超简单第二弹:函数
  • PyTorch 2.6镜像效果展示:开箱即用的GPU加速环境实测
  • 揭秘2026年口碑好的浴室柜加盟品牌拓展,价格多少钱 - 工业品牌热点
  • 如何用SD-PPP插件实现Photoshop与AI绘图的无缝协作:3大核心功能详解
  • 国际电信联盟(International Telecommunication Union, ITU)是联合国下属历史最悠久的专门机构
  • 3分钟掌握图表数据提取:WebPlotDigitizer让科研分析效率翻倍
  • Wan2.2-I2V-A14B与Java集成实战:JDK1.8环境下构建企业级调用客户端
  • 论文通关不踩坑:Paperxie,查重降重双 buff 拉满的学术神器
  • 千问3.5-2B赋能前端设计:智能UI组件代码生成与样式建议
  • 掌握Python数据分析核心技巧实战
  • 12.主程序代码word版本少了功能,不全
  • JavaScript中原型链的查找机制与终点null的意义
  • 30+文档平台一键下载:告别繁琐操作,免费获取全网学习资料
  • 题解:Just Jump
  • ctfileGet:告别广告等待,5分钟掌握城通网盘直连解析技术
  • 大模型、RAG、Agent 一起落地后,为什么AI系统测试比传统测试难这么多?
  • Steam成就管理器终极指南:5分钟学会如何轻松解锁和管理游戏成就
  • Ostrakon-VL-8B在网络安全中的应用:识别与分析截图中的敏感信息与钓鱼界面
  • MySQL 事务日志写入机制
  • 图表数据提取神器:WebPlotDigitizer让科研效率提升10倍
  • org.openpnp.vision.pipeline.stages.MaskRectangle
  • GD32F450以太网(2-2):LAN8720A寄存器配置与实战调试指南
  • 辨析拓展训练器械工厂,性价比高的怎么选择 - 工业推荐榜
  • 终极城通网盘直连解析指南:5个专业技巧告别30秒广告等待
  • 如何彻底清理显卡驱动残留:Display Driver Uninstaller专业使用指南
  • 重磅更新!统信桌面操作系统V25专业版安装使用教程
  • 郭老师-爱你的人,还是你爱的人?
  • 解锁音乐自由:ncmdumpGUI——Windows平台NCM加密文件一键转换利器
  • 毕业季实测:Paperxie 双端深度测评,从查重到降 AIGC 的全流程实操指南