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

EF Core迁移执行失败:触发执行致登录失败求解决方案

问题描述

运行.NET项目时触发SQL登录错误:

Microsoft.Data.SqlClient.SqlException: 'Logon failed for login 'DESKTOP-S466H9W\User' due to trigger execution.

Changed database context to 'DB_NAME'.

Changed language setting to us_english.'

已执行的排查操作及结果:

  1. 检查数据库级触发器:
USE DB_NAME;
SELECT name, is_disabled
FROM sys.triggers
WHERE type = 'TR';

结果:无返回记录
2. 检查数据库用户及权限:

EXEC sp_helpuser 'DESKTOP-S466H9W\User';

SELECT * 
FROM sys.database_permissions 
WHERE grantee_principal_id = USER_ID('DESKTOP-S466H9W\User');

结果:

Msg 15198, Level 16, State 1, Procedure sp_helpuser, Line 142 [Batch Start Line 0]

The name supplied (DESKTOP-S466H9W\User) is not a user, role, or aliased login.

  1. 检查服务器角色成员及服务器主体:
EXEC sp_helpsrvrolemember 'DESKTOP-S466H9W\User';

SELECT * 
FROM sys.server_principals 
WHERE name = 'DESKTOP-S466H9W\User';

结果:

Msg 15412, Level 11, State 1, Procedure sp_helpsrvrolemember, Line 10 [Batch Start Line 0]

'DESKTOP-S466H9W\User' is not a known fixed role.

  1. 检查策略组策略及服务器审计:
SELECT * 
FROM sys.policy_group_policies;

SELECT * 
FROM sys.server_audits;

结果:

Msg 208, Level 16, State 1, Line 2

Invalid object name 'sys.policy_group_policies'.

此前SQL Server运行正常且未修改设置,寻求其他解决方案。

排查与解决方案

1. 检查服务器级登录触发器

之前仅排查了数据库级触发器,登录失败提示的触发器大概率是服务器级的。执行以下脚本:

SELECT name, is_disabled
FROM sys.server_triggers;

若找到触发器,先禁用测试是否能正常登录:

DISABLE TRIGGER [触发器名称] ON ALL SERVER;

登录成功后再排查触发器内的逻辑错误。

2. 验证登录账户及所属组

sys.server_principals无结果可能是账户名拼写错误,或用户通过Windows组间接授权。执行脚本查询所有Windows登录/组:

SELECT name, type_desc
FROM sys.server_principals
WHERE type IN ('U', 'G');

若找到对应Windows组,检查该组是否有登录权限,且当前用户属于该组。

3. 查看SQL Server错误日志

登录失败的详细原因会记录在错误日志中:

  • 打开SSMS,展开服务器 → 管理 → SQL Server日志
  • 查看最新日志,找到对应登录失败条目,获取触发器执行失败的具体报错信息

4. 检查登录账户的默认数据库

错误提示提到切换了数据库上下文,确认登录账户的默认数据库是否可访问:

SELECT name, default_database_name
FROM sys.server_principals
WHERE name = 'DESKTOP-S466H9W\User';

若默认数据库不存在或无权限,修改为master:

ALTER LOGIN [DESKTOP-S466H9W\User] WITH DEFAULT_DATABASE = master;

5. 临时用SQL身份验证测试

创建SQL登录并赋予权限,测试是否能正常连接,排除Windows账户或域的问题:

CREATE LOGIN [TestLogin] WITH PASSWORD = 'StrongPassword123!';
USE DB_NAME;
CREATE USER [TestLogin] FOR LOGIN [TestLogin];
ALTER ROLE db_owner ADD MEMBER [TestLogin];

用该账户连接项目,若成功则问题出在Windows账户授权或触发器逻辑。

内容的提问来源于stack exchange,提问作者h.khalili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:25:07