如何通过T-SQL为无所有者的SQL Server数据库设置当前用户为所有者
检测SQL Server数据库所有者并自动配置的T-SQL脚本
你遇到的报错信息如下:
Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission
该报错根因为目标数据库未配置所有者,可直接使用以下可集成到产品部署流程的T-SQL脚本实现「先检测所有者配置状态,未配置则自动将指定用户设为所有者」的需求。
实现逻辑
- 从
sys.databases系统视图查询指定数据库的owner_sid字段,该字段为NULL时判定为未配置所有者 - 仅未配置所有者时才执行变更操作,不会覆盖已有合法配置
- 支持自定义目标数据库名和要设置为所有者的登录账号
完整脚本
-- 自定义配置项:替换为你的实际数据库名和目标所有者登录名 DECLARE @TargetDBName SYSNAME = N'你的业务数据库名称' DECLARE @DesiredOwner SYSNAME = N'指定登录名(如sa、业务部署专用账号)' DECLARE @ExecSQL NVARCHAR(MAX) -- 检测数据库是否未配置所有者 IF EXISTS ( SELECT 1 FROM sys.databases WHERE name = @TargetDBName AND owner_sid IS NULL ) BEGIN SET @ExecSQL = N'ALTER AUTHORIZATION ON DATABASE::' + QUOTENAME(@TargetDBName) + N' TO ' + QUOTENAME(@DesiredOwner) EXEC sp_executesql @ExecSQL PRINT N'数据库' + @TargetDBName + N'所有者已成功设置为:' + @DesiredOwner END ELSE BEGIN PRINT N'数据库' + @TargetDBName + N'已存在所有者,无需操作' END
如果需要将当前执行脚本的登录账号设为所有者,直接将@DesiredOwner的赋值改为SYSTEM_USER即可,对应效果与你提到的EXEC sp_changedbowner [current]完全一致。
注意事项
- 执行脚本的账号需要具备sysadmin服务器角色或者
ALTER ANY DATABASE权限,否则无法完成所有者变更操作 - 脚本使用的
ALTER AUTHORIZATION是微软官方推荐的语法,兼容所有支持的SQL Server版本,你也可以根据习惯替换为sp_changedbowner存储过程调用
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

