SQL Server Express 2019自动备份权限错误排查求助
我正尝试为SQL Server Express 2019配置自动备份,使用Ola Hallengren的维护脚本。从提升权限的命令提示符执行以下命令:
sqlcmd -E -S .\SQLEXPRESS -d master -Q "USE master; grant execute on dbo.master.DatabaseBackup to [TODDCOM\itadmin]; EXECUTE dbo.DatabaseBackup @Databases = 'USER_DATABASES', @Directory = 'c:\sql2019\backup', @BackupType = 'FULL', @Verify = 'Y', @CheckSum ='Y'" -b -o C:\SQL2019\Backup\DatabaseBackup.txt robocopy c:\sql2019\backup \\NAS\backup\SQL\ /E /MIR /LOG:"\\NAS\Backup\robocopy-log.txt" /np
DatabaseBackup.txt中报告以下错误:
Changed database context to 'master'.
Msg 15151, Level 16, State 1, Server SPURR\SQLEXPRESS, Line 1
Cannot find the object 'DatabaseBackup', because it does not exist or you do not have permission.
Msg 229, Level 14, State 5, Server SPURR\SQLEXPRESS, Procedure dbo.DatabaseBackup, Line 1
The EXECUTE permission was denied on the object 'DatabaseBackup', database 'master', schema 'dbo'.
我已使用select suser_sname()确认所用账户与授权账户一致,目前已在以下位置配置了执行权限:
- master数据库的
dbo架构 - Security\Users文件夹中的'domain\admin'账户,已添加执行权限
- 在SSMS中右键master数据库,为'domain\admin'账户分配执行权限
- 右键所有用户数据库,为'domain\admin'账户添加执行权限
我认为只需在一处配置权限,但无法确定具体位置,恳请帮助排查问题。
更新1
根据反馈更新了命令及错误报告。
更新2
补充信息:我从计划任务批处理文件中执行以下代码:
sqlcmd -E -S .\SQLEXPRESS -d master -Q "SELECT SUSER_NAME(); select name, USER_NAME(s.principal_id) AS Schema_Owner from sys.schemas s;" -o C:\SQL2019\Backup\User.txt
输出结果为:
domain\admin (1 rows affected) name Schema_Owner -------------------- ---------------- dbo dbo guest guest INFORMATION_SCHEMA INFORMATION_SCHEMA sys sys db_owner domain\admin db_accessadmin db_accessadmin db_securityadmin db_securityadmin db_ddladmin db_ddladmin db_backupoperator domain\admin db_datareader db_datareader db_datawriter db_datawriter db_denydatareader db_denydatareader db_denydatawriter db_denydatawriter (13 rows affected)
排查与解决步骤
验证存储过程是否存在
先确认DatabaseBackup存储过程是否在master数据库的dbo架构下正确创建,执行以下SQL:USE master; SELECT * FROM sys.procedures WHERE name = 'DatabaseBackup';若查询无结果,说明维护脚本未正确执行,需重新运行脚本安装存储过程。
修正权限授予语句
原命令中的权限授予格式错误,正确的对象引用应为master.dbo.DatabaseBackup或在master库上下文直接写dbo.DatabaseBackup,且要确保授权对象是实际运行的domain\admin账户:USE master; GRANT EXECUTE ON dbo.DatabaseBackup TO [domain\admin];核对存储过程架构归属
检查存储过程所属架构是否为dbo,执行:USE master; SELECT name, schema_name(schema_id) AS schema_name FROM sys.procedures WHERE name = 'DatabaseBackup';直接测试存储过程执行
在SSMS中用domain\admin账户登录,直接执行备份语句:USE master; EXECUTE dbo.DatabaseBackup @Databases = 'USER_DATABASES', @Directory = 'c:\sql2019\backup', @BackupType = 'FULL', @Verify = 'Y', @CheckSum ='Y';以此区分是命令行执行的环境问题,还是权限本身的问题。
检查目录权限
确认domain\admin账户对c:\sql2019\backup本地目录、\\NAS\backup\SQL\共享目录拥有读写权限。
内容的提问来源于stack exchange,提问作者DauntlessRob

