允许应用程序角色执行 DBCC CHECKDB

Posted

技术标签:

【中文标题】允许应用程序角色执行 DBCC CHECKDB【英文标题】:Allow application role to perform DBCC CHECKDB 【发布时间】:2019-03-06 12:52:59 【问题描述】:

我的 (C#) 应用程序运行,连接到具有应用程序角色的 SQL 服务器数据库。

但是,我需要它来运行 DBCC CHECKDB,但我得到了一个异常:

用户“MyAppRole”无权为数据库“MyDatabase”运行 DBCC checkdb。

我发现要运行此命令,我不能只授予应用程序角色执行此操作的权限,我需要成为db_owner 角色的成员。

我尝试过的事情:

1: 在 SQL Management Studio 中,勾选此数据库的 MyAppRole 属性中的 db_owner 框。但是我得到了同样的例外。

2:添加 db_owner 角色。

exec sp_addrolemember 'db_owner', 'MyAppRole'

但是现在当我运行应用程序时,我在执行 DBCC CHECKDB 时遇到了这个异常:

服务器主体“MYDOMAIN\MyWindowsUsername”无法在当前安全上下文下访问数据库“MyDatabase”。

这尤其令人困惑,因为在 SQL Managment Studio 中,我可以在使用 Windows 身份验证登录后轻松运行命令。

3:创建一个以所有者身份执行的存储过程

CREATE PROCEDURE sp_dbcccheck WITH EXECUTE AS OWNER
AS
BEGIN
    DBCC CHECKDB (MyDatabase) WITH TABLERESULTS
END
GO

... 并给予我的MyAppRole 执行 权限。但我仍然得到异常:

服务器主体“MYDOMAIN\MyWindowsUsername”无法在当前安全上下文下访问数据库“MyDatabase”。

...如果我尝试从 SQL Management Studio 执行此存储过程,我也会得到。

4:授予应用程序角色“控制”权限(其中一些似乎违背了应用程序角色的目的,但无论如何,抓住了稻草)

GRANT CONTROL ON DATABASE::MyDatabase TO MyAppRole

但这会导致应用程序尝试运行检查时出现原始错误。

用户“MyAppRole”没有权限为数据库“MyDatabase”运行 DBCC checkdb

如何正确授予我的应用程序角色执行此检查的权限?

【问题讨论】:

【参考方案1】:

来自MSDN

需要 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员身份。

您在第 1 步中遇到的问题可能是因为 windows 用户未映射到您要连接的数据库。

【讨论】:

当我查看这个(Windows)登录的属性时,我看到这个数据库的“地图”被勾选了,但是“用户”是 dbo。如果我尝试更改它,我会收到一条错误消息Cannot alter the user 'dbo'。顺便说一句,Windows 登录是服务器上的系统管理员。 @colmde 尝试 - ***.com/questions/8471124/… 确认角色/权限列表。您需要将权限授予正确的映射用户/组。【参考方案2】:

我不是SQL Server DBA 专家,但我在发布我的经验。

根据docsDBCC CHECKDB commnad 需要sysadmin 固定服务器角色或db_owner 固定数据库角色。由于应用程序角色不能是sysadmin 角色的成员,我们只能考虑第二个选项。

我们想使用当前数据库进行操作,因此我们不需要服务器级别的权限,数据库级别的权限就足够了。因此db_owner 成员资格应该可以解决问题,它对数据库用户非常有效,但由于某种原因,它应用程序角色不起作用

我尝试为 app 角色添加所有其他 db 角色,检查看起来不错的用户映射,甚至尝试执行 DBCC TRACEON (4616, -1); 提到的 here,但它也没有帮助,服务器继续从你的第二段。

我只能通过为当前数据库启用guest 用户来使其工作,但这打破了应用程序角色的想法。

我得出了一个结论(不确定它是否正确),这是不可能的,而是使用常规的db roledb users

【讨论】:

以上是关于允许应用程序角色执行 DBCC CHECKDB的主要内容,如果未能解决你的问题,请参考以下文章

数据库置疑之后修复完,用 dbcc checkdb(数据库名) 检查数据的时候提示有一致性错误

MS Sql Server 数据库或表修复(DBCC CHECKDB)

修复SQL2000数据库置疑时出现的错误

SQLSERVER DBCC命令大全

SQL Server 2005 中的内置数据库角色允许执行存储过程?

Spring Switching User:只允许具有特定角色的用户切换到具有特定角色的另一个用户