我的(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
如何正确授予我的应用程序角色权限以执行此检查?
答案 0 :(得分:0)
答案 1 :(得分:0)
我不是SQL Server
DBA专家,但是我在发布我的经验。
根据docs DBCC CHECKDB
命令,需要sysadmin
固定服务器角色或db_owner
固定数据库角色。由于应用程序角色不能为sysadmin
角色的成员,因此我们只能考虑第二个选项。
我们想使用当前数据库,因此我们不需要服务器级别的权限,数据库级别的权限就足够了。因此,db_owner
成员身份应该可以解决这个问题,它对于数据库用户来说是完美的,但是由于某种原因,对于应用程序角色,它不起作用。
我尝试为应用程序角色添加所有其他数据库角色,检查了看起来不错的用户映射,甚至尝试执行提到的here的DBCC TRACEON (4616, -1);
,但也无济于事,服务器继续在第二段中抛出错误。
我设法仅通过为当前数据库启用guest
用户来使其起作用,但这打破了应用程序角色的概念。
我得出结论(不确定它是正确的)是不可能的,并改用常规的db role
和db users