Sql server 通过存储过程授予对sys对象的访问权限

Sql server 通过存储过程授予对sys对象的访问权限,sql-server,Sql Server,我想允许用户执行存储过程。存储过程从系统索引中选择数据 但是,向存储过程授予EXECUTE权限不起作用,我仍然会得到错误 用户没有执行此操作的权限 由于用户无法访问系统索引 我能做什么(不给用户直接选择访问sys.indexes表)?您需要授予用户访问该表的权限: 向用户授予选择系统索引的权限 如果不想授予对该表的访问权,可以使用所有权链接。问题是sys.index的所有者是securityadmin: SELECT * FROM sys.schemas AS S INNER JOIN sys

我想允许用户执行存储过程。存储过程从系统索引中选择数据

但是,向存储过程授予
EXECUTE
权限不起作用,我仍然会得到错误

用户没有执行此操作的权限

由于用户无法访问系统索引


我能做什么(不给用户直接
选择
访问sys.indexes表)?

您需要授予用户访问该表的权限:

向用户授予选择系统索引的权限

如果不想授予对该表的访问权,可以使用所有权链接。问题是
sys.index
的所有者是
securityadmin

SELECT * FROM sys.schemas AS S
INNER JOIN sys.server_principals AS SP 
ON S.principal_id = SP.principal_id
WHERE S.name = 'sys'

因此,问题是您需要创建一个所有者为
securityadmin
的过程。为此,您可以创建它,然后使用ol'good。正如您在文档中看到的,它已被弃用,但还有其他选择。

我不希望他们能够在不使用存储过程的情况下从该表中进行选择,就像您通常使用普通表来控制安全性一样。哎呀,当我读到您的问题时,我是盲目的。我已经更新了我的答案。希望这能解决你的问题。事实上,你没有注意到我问题的这一部分,因为我只是在你回答后才将它编辑进来:)不管怎样,你的回答有道理,但我无法让它工作。如果尝试使用sp_changeobjectowner将所有权转移到'securityadmin',它会显示“此数据库中不存在数据库主体或架构'securityadmin'。我可以转移到'db_securityadmin',但这会导致与我最初遇到的问题相同的问题。我猜“db_securityadmin”和“securityadmin”不一样……这很奇怪。您是在使用动态SQL还是什么?通常,如果过程的所有者对基础对象(在本例中为sys.indexes)具有权限,则在过程上执行就足够了。