You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动