SQL触发器如何获取触发源应用名_利用APP_NAME函数追踪

能,但仅当连接字符串显式设置Application Name参数时有效;SQL Server仅返回客户端声明的名称,未设置则为空或默认值,且受连接池、代理等影响易失真。SQL Server 里 APP_NAME() 真的能拿到应用名吗?能,但只在连接字符串里显式设置了 Application Name 参数时才有效。SQL Server 自身不主动识别"哪个程序连上来",它只是原样返回客户端在登录时声明的名称。没设就是空字符串或默认值(比如 .Net SqlClient Data Provider),触发器里查 APP_NAME() 就会得到这个"假名"。Java 应用需在 JDBC URL 加 applicationName=xxx(如 jdbc:sqlserver://...;applicationName=OrderService).NET 应用必须在连接字符串中写明 Application Name=xxx,不能靠 SqlConnection.ConnectionString 动态拼接后忽略该字段SSMS 或 sqlcmd 默认不带 Application Name,直接执行触发器看到的是 Microsoft SQL Server Management Studio 或空值触发器中调用 APP_NAME() 的典型写法和陷阱它是个无参标量函数,直接用就行,但位置和时机很关键------必须在触发器主体内、DML 操作发生后立即读取,不能依赖外部变量缓存,也不能放在函数或视图里间接调用(会报错或返回会话默认名)。正确:在 AFTER INSERT/UPDATE/DELETE 触发器里直接写 SELECT @app = APP_NAME()错误:在 INSTEAD OF 触发器里先做 INSERT 再查 APP_NAME() ------ 此时连接上下文可能已变化错误:把 APP_NAME() 当成列放进 INSERT INTO ... SELECT 的子查询里,若目标表有约束或触发器嵌套,可能引发不可预期的会话名漂移CREATE TRIGGER tr_log_orders ON orders AFTER INSERT ASBEGIN DECLARE @app NVARCHAR(128) = APP_NAME(); INSERT INTO audit_log (table_name, operation, app_name, log_time) VALUES ('orders', 'INSERT', @app, GETDATE());END为什么有时候 APP_NAME() 返回空或奇怪的值?根本原因不是函数坏了,而是连接层没传真实标识。尤其在连接池复用、中间件代理、ORM 自动连接管理场景下,应用名极易被覆盖或丢失。 Zeemo AI 一款专业的视频字幕制作和视频处理工具

相关推荐
吹什么轩5 分钟前
MySQL 事务管理:从 ACID 到 MVCC,一篇讲透
数据库·mysql
Dumbness8 分钟前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
甜到心里的蛋糕14 分钟前
从 QQ 机器人到 B 站 AI 运营:一套可复现的视频流水线踩坑实录
运维·人工智能·python·自动化·视频制作
张驰咨询公司16 分钟前
六西格玛Python DOE试验矩阵:3因子2水平生成与验算
python·六西格玛·实验设计·itertools·doe试验矩阵
时间售卖铺1 小时前
Oracle DQL精髓:从基础到高级实战
运维·数据库·云原生·oracle
像风一样自由20201 小时前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi
m0_639906941 小时前
MySQL 锁机制详解|表锁、行锁、意向锁,死锁成因与解决方案
数据库·mysql
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛
田里的水稻1 小时前
FA_CNN卷积神经网络十八---感知机到多层感知机PyTorch
人工智能·pytorch·python
进击的荆棘1 小时前
MySQL——在ubuntu环境下安装MySQL
数据库·mysql·ubuntu