SSIS作业报错229:sys.database_principals的SELECT权限被拒如何解决
问题排查与解决方案
标题:SQL Server Integration Services
对象'database_principals'、数据库'mssqlsystemresource'、架构'sys'的SELECT权限被拒绝。(Microsoft SQL Server,错误:229)
以下操作均需要使用拥有sysadmin固定服务器角色的账户登录SQL Server执行,否则会出现权限不足无法修改配置的问题。
步骤1:确认SSIS作业的实际运行身份
SSIS作业运行时使用的身份并非SSIS目录所有者,而是SQL Server代理作业配置的运行身份,优先执行以下SQL查询确认对应账户:
SELECT j.name AS JobName, js.step_name AS StepName, js.subsystem, js.proxy_id, p.name AS ProxyName, c.credential_identity AS ProxyAccount FROM msdb.dbo.sysjobs j JOIN msdb.dbo.sysjobsteps js ON j.job_id = js.job_id LEFT JOIN msdb.dbo.sysproxies p ON js.proxy_id = p.proxy_id LEFT JOIN msdb.dbo.syscredentials c ON p.credential_id = c.credential_id WHERE j.name = N'替换为你的SSIS作业实际名称'
如果查询结果中proxy_id为0,说明作业使用SQL Server代理服务本身的账户运行。
步骤2:移除拒绝权限限制
执行以下SQL移除对应用户的拒绝读写权限:
USE SSISDB GO -- 替换[]内的内容为步骤1查询到的作业运行账户 ALTER ROLE db_denydatareader DROP MEMBER [你的作业运行账户] GO ALTER ROLE db_denydatawriter DROP MEMBER [你的作业运行账户] GO -- 如果确认是dbo账户被添加了拒绝权限,执行以下两句 ALTER ROLE db_denydatareader DROP MEMBER dbo GO ALTER ROLE db_denydatawriter DROP MEMBER dbo GO
步骤3:分配必要的访问权限
服务器级权限配置
USE master GO GRANT VIEW SERVER STATE TO [你的作业运行账户] GO GRANT VIEW ANY DEFINITION TO [你的作业运行账户] GO -- 显式授予system resource相关元数据查询权限 GRANT SELECT ON sys.database_principals TO [你的作业运行账户] GO
SSIS目录权限配置
USE SSISDB GO ALTER ROLE ssis_admin ADD MEMBER [你的作业运行账户] GO -- 如需给dbo补ssis_admin权限执行以下语句 ALTER ROLE ssis_admin ADD MEMBER dbo GO
步骤4:验证修复效果
重新触发SSIS作业执行,确认不再抛出229权限错误。如果仍有报错,可进一步排查SSIS包内部使用的连接字符串对应账户是否有业务数据库的访问权限。
内容的提问来源于stack exchange,提问作者yalda sana
相关产品推荐
相关产品推荐

