运行此查询时出现错误:
SELECT
dependencies.referencing_id as object_id,
dependencies.referencing_minor_id as column_id,
dependencies.referenced_id AS referenced_object_id,
RTRIM(referenced_objects.type) AS referenced_type
FROM
sys.sql_expression_dependencies AS dependencies
JOIN sys.objects AS referenced_objects WITH(NOLOCK) ON referenced_objects.object_id = dependencies.referenced_id
WHERE dependencies.referencing_id != dependencies.referenced_id
错误:
对象“sql_expression_dependencies”、数据库“mssqlsystemresource”、模式“sys”的 SELECT 权限被拒绝。
该登录名仅具有 PUBLIC 服务器角色的成员资格,并被授予查看任何数据库和查看任何定义的权限。我为我正在比较的数据库添加了一个具有 PUBLIC 数据库角色成员身份的用户。我认为服务器级别的权限就足够了,但我错了。除了 2014 数据库之外,我还在 2008R2 数据库上执行此操作。
在 2014 年的数据库中,我还授予了服务器级别权限 SELECT ALL USER SECURABLES。错误仍然存在。
我在数据库上授予了用户 SELECT。错误仍然存在。
我删除了 SELECT 权限并将用户添加到 data_reader 数据库角色。查询已解决,但未返回任何数据(与系统管理员运行相同的查询返回 130 多行)。现在我完全困惑了。
我在 sys.sql_expression_dependencies 上明确授予用户 SELECT 权限,结果与上述相同。
在研究了这些权限之后,共识似乎是在数据库上向用户授予 SELECT 与将用户添加到 data_reader 角色相同。但显然情况并非如此。我想创建一个具有最小权限集的登录/用户来实现比较。
如何在不授予对整个数据库的 data_reader 访问权限的情况下授予对 mssqlsystemresource 中 sys.sql_expression_dependencies 视图的访问权限?有没有办法只在 mssqlsystemresource 上授予 SELECT ?
**注意 - 我在 SE 上阅读了有关 mssqlsystemresource 的其他几篇文章,但它们与此无关:
- 我没有拒绝任何分配给此登录名/用户的内容
- PUBLIC 角色(服务器或数据库)中的成员身份没有任何影响,因为权限与“已知良好”服务器上的权限相同。
- 我宁愿不让用户对整个数据库拥有一揽子 SELECT 权限。