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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:05:36