我的 (C#) 应用程序运行,连接到具有应用程序角色的 SQL 服务器数据库。
但是,我需要它来运行 a 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
如何正确授予我的应用程序角色执行此检查的权限?