能,但仅当连接字符串显式设置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 一款专业的视频字幕制作和视频处理工具
相关推荐
罗狮粉 991 分钟前
AI-Gateway — 面向 AI Agent 的本地 Runtime Gateway蓝胖的四次元口袋4 分钟前
Python数据结构知识梳理程序员清风5 分钟前
生产级智能体平台设计:任务编排、工具管理与运行监控文人sec12 分钟前
grant 之后要跟着 flush privileges 吗?要不要使用分区表?高级程序源18 分钟前
django招聘网站信息爬取与分析系统79704-计算机课程设计、毕业设计Madison-No719 分钟前
基于JMeter工具的性能测试(接口)Omics Pro23 分钟前
上海AI Lab孙思琦×高张阳:虚拟细胞代码库智能体小白快快跑哦31 分钟前
python-字符串全解(五):字符串格式化表达式以及格式化方法(2)旺仔不是程序员44 分钟前
相关子查询与性能优化:PostgreSQL 逐行执行的代价与 JOIN 重写专业程序开发源1 小时前
springboot篮球联赛管理系统13635-计算机课程设计、毕业设计