如何在SQL Server中利用触发器验证JSON字段格式的合法性?

夏芳大大_4483

夏芳大大_4483

2026-10-14

433人浏览

原创

isjson()是sql server 2016+唯一原生json语法校验函数,返回1表示语法合法,0表示非法,null表示输入为null;仅校验括号、引号、转义等基础语法,不检查字段存在性、类型或业务规则。

如何在sql server中利用触发器验证json字段格式的合法性?

SQL Server 2016+ 中 ISJSON() 是唯一可靠的内置校验函数

SQL Server 不提供 JSON Schema 验证或结构深度校验能力,ISJSON() 是判断字符串是否为合法 JSON 的唯一原生方式。它只检查语法有效性(如括号匹配、引号闭合、转义字符),不校验字段是否存在、类型是否匹配或值是否在业务范围内。

常见误用是把 ISJSON() 当作“业务规则检查”——比如期望 {"id": 1, "name": "a"},却对 {"id": "1", "name": null} 放行,后者也完全合法。

  • ISJSON() 返回 1 表示语法合规,0 或 NULL 表示非法(含 NULL 输入)
  • 必须配合 TRY_PARSE_JSON()(SQL Server 2022+)才能进一步提取并校验字段类型,旧版本只能靠 JSON_VALUE() + ISNULL() 组合试探
  • 触发器中调用 ISJSON() 性能开销极低,但频繁解析大 JSON(>1MB)可能拖慢 INSERT/UPDATE

在 AFTER INSERT/UPDATE 触发器中校验 JSON 字段的典型写法

不要用 INSTEAD OF —— 它会绕过约束和默认值,且 JSON 校验失败时需手动回滚,逻辑更重。直接在 AFTER 触发器里抛出错误即可中断事务。

关键点:必须遍历 inserted 表逐行检查,不能只查第一行;错误信息要包含具体行标识(如主键),否则调试困难。

Wjs Uploading Video
Wjs Uploading Video

将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。

下载
CREATE TRIGGER tr_validate_json_payload
ON dbo.orders
AFTER INSERT, UPDATE
AS
BEGIN
    IF EXISTS (
        SELECT 1 
        FROM inserted i 
        WHERE ISJSON(i.payload) = 0
    )
    BEGIN
        DECLARE @bad_id INT = (SELECT TOP 1 id FROM inserted WHERE ISJSON(payload) = 0);
        THROW 50000, 'Invalid JSON in payload for order ID: ' + CAST(@bad_id AS VARCHAR(10)), 1;
    END
END;
  • 避免在 WHERE 条件里直接用 ISJSON(payload) = 0 后接 SELECT * —— 可能因多行失败导致 THROW 报错信息不明确
  • 若表有复合主键,需拼接多个字段到错误消息中,例如 CAST(i.order_no AS VARCHAR) + '-' + i.version
  • SQL Server 2019 及以下版本不支持 JSON_SCHEMA_VALIDATION,别试图用 OPENJSON 模拟 Schema 校验——性能差且无法覆盖嵌套缺失字段

当需要校验 JSON 内部字段存在性或类型时,用 JSON_VALUE() + ISNULL() 组合兜底

例如要求 payload 必须含字符串型 customer_id 和数字型 total,仅靠 ISJSON() 不够。此时需分步提取并判空/类型:

-- 示例:校验 customer_id 存在且为非空字符串,total 存在且可转为数字
IF EXISTS (
    SELECT 1 FROM inserted i
    WHERE ISJSON(i.payload) = 0
       OR JSON_VALUE(i.payload, '$.customer_id') IS NULL
       OR JSON_VALUE(i.payload, '$.total') IS NULL
       OR TRY_CONVERT(DECIMAL(10,2), JSON_VALUE(i.payload, '$.total')) IS NULL
)
BEGIN
    THROW 50000, 'Missing or invalid required fields in payload', 1;
END
  • JSON_VALUE() 对不存在路径返回 NULL,所以用 ISNULL() 或直接 IS NULL 判断比用 JSON_QUERY() 更安全
  • TRY_CONVERT() 比 ISNUMERIC() 可靠,后者对 '.'、'e3' 等都返回 1,但无法转成 DECIMAL
  • 嵌套对象(如 $.address.city)需确保路径完整,中间任一节点缺失即整条路径返回 NULL —— 这是优点,不是 bug

生产环境必须注意的三个隐形陷阱

触发器里的 JSON 校验看似简单,但上线后最容易在这些地方翻车:

  • 空字符串 ''、空白符 ' '、NULL 均被 ISJSON() 判为 0,但应用层可能传了空格包裹的 JSON,需前置 TRIM()(SQL Server 2017+)
  • 触发器不会自动处理 UPDATE 时 JSON 字段未被修改的情况 —— 如果业务允许部分更新,得加 UPDATE(payload) 判断避免无谓校验
  • SQL Server 日志中不会记录触发器抛出的 THROW 错误堆栈,排查时务必在错误消息里塞入足够上下文(如 @@SPID、HOST_NAME())

真正难的不是写校验逻辑,而是定义清楚:哪些字段是强约束,哪些可以宽松;JSON 是只读载体还是会被后续存储过程反复解析 —— 这些决策直接影响触发器里该做多深的检查。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2095

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3122

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1056

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3559

7

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5331

4

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2625

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3861

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2891

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

947

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习