SQL Server 2017非管理员创建只读角色报错:Invalid object name 'SSISDB.dbo.DDLEvents'
解决SQL Server 2017创建角色分配只读权限时出现的“无效对象名'SSISDB.dbo.DDLEvents'”错误
这个问题我之前处理过不少次,核心原因要么是SSISDB数据库的DDLEvents表缺失,要么是你当前操作的账号(即便有服务器管理员权限)在执行创建角色的过程中,没有足够权限访问SSISDB——毕竟SSMS图形界面操作时会偷偷触发一些系统数据库的后台检查,而管理员账号默认拥有全权限,所以不会报错。
给你几个一步步落地的解决方案:
1. 先确认SSISDB和DDLEvents表的状态
用管理员账号登录SQL Server,执行以下T-SQL检查:
USE SSISDB; GO SELECT name FROM sys.tables WHERE name = 'DDLEvents';
如果查不到结果,说明SSISDB没有正确初始化(可能是安装SQL Server时没配置SSIS目录),需要重新部署SSIS目录:
- 打开SSMS,连接到服务器,展开“Integration Services Catalogs”
- 右键点击“SSISDB”选择“删除”(如果存在的话)
- 再右键点击“Integration Services Catalogs”,选择“创建目录”,按向导完成初始化
2. 给当前操作账号授予SSISDB的必要权限
即使你有服务器管理员权限,针对SSISDB的权限有时需要显式授予。执行以下语句:
USE SSISDB; GO -- 授予查看定义权限 GRANT VIEW DEFINITION TO [你的账号名]; -- 授予DDLEvents表的查询权限 GRANT SELECT ON dbo.DDLEvents TO [你的账号名];
嫌麻烦的话,也可以直接把账号加入SSISDB的只读角色:
USE SSISDB; GO ALTER ROLE [ssis_logreader] ADD MEMBER [你的账号名];
3. 用T-SQL手动创建角色,绕开SSMS的后台操作
有时候SSMS的图形界面会触发不必要的系统数据库访问,改用纯T-SQL创建角色和分配权限更可靠:
-- 创建服务器级只读角色 CREATE SERVER ROLE [GlobalReadOnlyRole]; GO -- 遍历所有用户数据库,创建库级只读角色并分配权限 EXEC sp_MSforeachdb ' IF DB_ID(''?'') > 4 -- 跳过master、model、msdb、tempdb四个系统库 BEGIN USE [?]; -- 库级角色不存在则创建 IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = ''DBReadOnlyRole'') CREATE ROLE [DBReadOnlyRole]; -- 给库级角色授予只读权限 GRANT SELECT, VIEW DEFINITION TO [DBReadOnlyRole]; -- 把服务器角色映射到库级角色 ALTER ROLE [DBReadOnlyRole] ADD MEMBER [GlobalReadOnlyRole]; END' GO -- 把你的账号加入服务器级只读角色 ALTER SERVER ROLE [GlobalReadOnlyRole] ADD MEMBER [你的账号名]; GO
4. 切换SSMS的默认连接数据库
如果你的SSMS连接默认数据库不是master,切换后再操作也可能避免触发对SSISDB的后台检查:
- 右键点击SSMS中的服务器连接,选择“属性”
- 在“连接”选项卡中,把“默认数据库”改成
master - 断开重连后再尝试创建角色
内容的提问来源于stack exchange,提问作者Vlogs Bengali




