You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过SQL语句更新Asp.Net Claims:为现有用户添加声明失败求助

问题分析与修复方案

首先,你的查询存在几个关键问题,导致它要么执行结果不符合预期,要么直接报错,我来逐一拆解:

1. 核心错误:UserId 赋值逻辑错误

AspNetUserClaims 表中的 UserId 字段是外键,关联的是 AspNetUsers 表的主键 Id(通常是GUID或整数类型),而不是 UserName(字符串类型)。你把 f.UserName 赋值给 UserId,要么会因为数据类型不匹配报错,要么会破坏外键关联,导致这条声明无法正确关联到用户。

2. 缺少关联条件,会导致全表更新

你的 UPDATE 语句没有将 AspNetUserClaims 和子查询 f 做关联,执行后会把 AspNetUserClaims 表的所有行都更新,这绝对不是你想要的结果。

3. 关于 Id 列报错的原因

AspNetUserClaims 的 Id 列一般是主键(可能是自增列或GUID主键),主键列不允许随意更新:

  • 如果是自增列,数据库会自动维护其值,手动更新会直接报错;
  • 如果是GUID主键,虽然语法上允许,但修改主键会破坏数据完整性,完全没有必要。所以你注释掉 Id 列是正确的,但这不是核心问题。

针对你的需求,分两种情况给出正确语句

情况一:更新该用户已存在的声明

如果你想修改用户 abc@gmail.com 现有的某个声明(比如把旧的声明类型改成 EmployeeNumber),可以用关联更新:

update auc
set auc.ClaimType = 'EmployeeNumber', 
    auc.ClaimValue = '1'
from [test_MIM].[dbo].[AspNetUserClaims] auc
inner join [test_MIM].[dbo].[AspNetUsers] au 
    on auc.UserId = au.Id
where au.UserName = 'abc@gmail.com'
-- 可选:如果只想更新特定类型的声明,添加下面的条件
-- and auc.ClaimType = '旧的声明类型'

情况二:给该用户新增一条声明

你提到是“添加声明”,那应该用 INSERT 而不是 UPDATE,因为 UPDATE 是修改现有行,新增需要插入新记录:

insert into [test_MIM].[dbo].[AspNetUserClaims] (UserId, ClaimType, ClaimValue)
select Id, 'EmployeeNumber', '1'
from [test_MIM].[dbo].[AspNetUsers]
where UserName = 'abc@gmail.com'

内容的提问来源于stack exchange,提问作者Rilcon42

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:02:55