SQL Server 15404(0x5)错误修复求助:关联Redgate后无法执行脚本
问题解决:Redgate SQL Source Control触发0x5错误且无法修改数据库所有者
环境与问题
- SQL Server 2019(15.0.4298.1),账号为SQL Server sysadmin+服务器本地管理员组成员
- 5个自建用户数据库,通过AD组配置权限,本人所属的Admin AD组为db_owner角色成员
- 创建数据库时使用自身凭据,导致dbo用户关联本人AD身份,无法将自己作为用户添加回数据库
- 配置Redgate SQL Source Control并关联Bitbucket后,执行锁定对象脚本,后续任何脚本(如存储过程创建/修改)均触发0x5错误
- 尝试将数据库所有者改为sa时,触发如下错误:
无法获取Windows NT组/用户'
'的信息,错误代码0x5。(.Net SqlClient Data Provider)
服务器名称: [myservername]
错误号: 15404
严重级别: 16
状态: 19
存储过程: RG_SQLSourceControl_DDLTrigger
已尝试操作:
- 变更数据库所有者,触发相同错误
- 检查域用户信息,确认存在且拼写正确
- 验证SQL Server及服务器主机的管理员权限
- 尝试恢复数据库,因创建用户脚本触发相同错误失败
解决方案(无需回滚源码控制配置)
步骤1:禁用Redgate的DDL触发器
错误由Redgate的DDL触发器触发,先禁用它以绕开账户验证:
-- 单个数据库处理 USE [你的数据库名]; GO DISABLE TRIGGER [RG_SQLSourceControl_DDLTrigger] ON DATABASE; GO -- 批量处理所有用户数据库 DECLARE @DBName NVARCHAR(128); DECLARE db_cursor CURSOR FOR SELECT name FROM sys.databases WHERE name NOT IN ('master','model','msdb','tempdb'); OPEN db_cursor; FETCH NEXT FROM db_cursor INTO @DBName; WHILE @@FETCH_STATUS = 0 BEGIN EXEC('USE [' + @DBName + ']; DISABLE TRIGGER [RG_SQLSourceControl_DDLTrigger] ON DATABASE;'); FETCH NEXT FROM db_cursor INTO @DBName; END; CLOSE db_cursor; DEALLOCATE db_cursor; GO
步骤2:修改数据库所有者为sa(或其他SQL登录账户)
-- 单个数据库处理 ALTER AUTHORIZATION ON DATABASE::[你的数据库名] TO [sa]; GO -- 批量处理所有用户数据库 DECLARE @DBName NVARCHAR(128); DECLARE db_cursor CURSOR FOR SELECT name FROM sys.databases WHERE name NOT IN ('master','model','msdb','tempdb'); OPEN db_cursor; FETCH NEXT FROM db_cursor INTO @DBName; WHILE @@FETCH_STATUS = 0 BEGIN EXEC('ALTER AUTHORIZATION ON DATABASE::[' + @DBName + '] TO [sa];'); FETCH NEXT FROM db_cursor INTO @DBName; END; CLOSE db_cursor; DEALLOCATE db_cursor; GO
步骤3:重新启用Redgate的DDL触发器
-- 单个数据库处理 USE [你的数据库名]; GO ENABLE TRIGGER [RG_SQLSourceControl_DDLTrigger] ON DATABASE; GO -- 批量处理所有用户数据库 DECLARE @DBName NVARCHAR(128); DECLARE db_cursor CURSOR FOR SELECT name FROM sys.databases WHERE name NOT IN ('master','model','msdb','tempdb'); OPEN db_cursor; FETCH NEXT FROM db_cursor INTO @DBName; WHILE @@FETCH_STATUS = 0 BEGIN EXEC('USE [' + @DBName + ']; ENABLE TRIGGER [RG_SQLSourceControl_DDLTrigger] ON DATABASE;'); FETCH NEXT FROM db_cursor INTO @DBName; END; CLOSE db_cursor; DEALLOCATE db_cursor; GO
步骤4:验证修复效果
执行测试脚本确认是否正常:
USE [你的数据库名]; GO CREATE PROCEDURE TestProc AS BEGIN SELECT 1 AS TestCol; END; GO DROP PROCEDURE TestProc; GO
原因说明
当前数据库所有者为你的AD账户,Redgate的DDL触发器执行时需要解析该账户信息,因域信任或账户权限问题出现0x5(访问被拒绝)错误。先禁用触发器绕开验证,修改所有者为SQL内置账户(如sa)后,触发器执行时无需再解析你的AD账户,即可恢复正常。
内容的提问来源于stack exchange,提问作者Aurora
相关产品推荐
相关产品推荐

