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.'
已执行的排查操作及结果:
- 检查数据库级触发器:
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.
- 检查服务器角色成员及服务器主体:
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.
- 检查策略组策略及服务器审计:
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

