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

时间:2018-10-01 12:01:29

标签: c# sql-server application-role

我的(C#)应用程序运行,并通过“应用程序角色”连接到SQL Server数据库。

但是,我需要它来运行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:授予应用程序角色“ CONTROL”权限(其中一些似乎违反了应用程序角色的目的,但无论如何,还是很困难)

GRANT CONTROL ON DATABASE::MyDatabase TO MyAppRole

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

  

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

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

2 个答案:

答案 0 :(得分:0)

来自MSDN

  

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

步骤1导致的问题可能是因为Windows用户未映射到您要连接的数据库。

答案 1 :(得分:0)

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

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

我们想使用当前数据库,因此我们不需要服务器级别的权限,数据库级别的权限就足够了。因此,db_owner成员身份应该可以解决这个问题,它对于数据库用户来说是完美的,但是由于某种原因,对于应用程序角色,它不起作用

我尝试为应用程序角色添加所有其他数据库角色,检查了看起来不错的用户映射,甚至尝试执行提到的hereDBCC TRACEON (4616, -1);,但也无济于事,服务器继续在第二段中抛出错误。

我设法仅通过为当前数据库启用guest用户来使其起作用,但这打破了应用程序角色的概念。

我得出结论(不确定它是正确的)是不可能的,并改用常规的db roledb users