我正在尝试在存储过程中运行此查询:
DECLARE @Params NVARCHAR(MAX)
SELECT @Params = event_info
FROM sys.dm_exec_input_buffer(@@SPID, CURRENT_REQUEST_ID())
为了捕获存储过程的执行参数并在必要时打印它们(对于调试非常有用)。因此,对于我的 [dbo]
用户来说,工作得很好,但问题是当 [AppUser]
(具有有限权限)尝试执行相同的存储过程时,会出现此错误:
VIEW SERVER PERFORMANCE STATE permission was denied on object 'server', database 'master'.
我尝试在 master 中创建用户并分配给他:
将 View 数据库状态授予 [AppUser]
:不起作用RANT VIEW SERVER STATE TO [AppUser]
:Azure SQL 不支持ALTER SERVER ROLE ##MS_ServerStateReader## ADD MEMBER [AppUser]
:不起作用。
我知道我可以自己打印执行参数或将其记录到例如dbo.traceTable
,事实上这就是我所做的,直到我发现这个查询非常简单且更容易使用。
那么,我是否可以向 [AppUser]
分配任何权限,以便有权检索查询数据?
提前致谢!
编辑:
似乎我必须在角色分配后重新登录:ALTER SERVER ROLE ##MS_ServerStateReader## ADD MEMBER [AppUser]
才能进行更改。
现在我的问题是初始查询无法与 dapper 正常工作,但这是另一个故事......
最佳答案
我使用管理员身份验证创建了 Azure sql 数据库的登录名,并使用以下代码在 master 数据库中创建了新的登录名:
create login1 with password = '<password>'
我在所需的数据库中创建了一个具有上述登录名的用户,并为该用户分配了角色。
USE [database]
GO
CREATE USER <user> FOR LOGIN <login>
GO
ALTER ROLE db_owner ADD MEMBER <user>
GO
我使用新用户登录数据库并尝试执行以下代码:
DECLARE @Params NVARCHAR(MAX)
SELECT @Params = event_info
FROM sys.dm_exec_input_buffer(@@SPID, CURRENT_REQUEST_ID())
我收到以下错误:
我使用管理员身份验证登录主数据库,并将以下角色添加到新登录
ALTER SERVER ROLE ##MS_ServerStateReader##
ADD MEMBER login1;
GO
我通过使用新的登录身份验证连接主数据库而不是我的数据库来查询相同的内容,它成功执行,没有任何错误:
关于sql-server - 在 Azure SQL 中检索服务器状态数据的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75679803/