你如何在隐藏资源数据库 mssqlsystemresource 上 GRANT SELECT?

Ste*_*eli 4 sql-server sql-server-2008-r2 sql-server-2014

运行此查询时出现错误:

    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
Run Code Online (Sandbox Code Playgroud)

错误

对象“sql_expression_dependencies”、数据库“mssqlsystemresource”、架构“sys”的 SELECT 权限被拒绝。

Login 仅具有 PUBLIC 服务器角色的成员资格,并被授予 VIEW ANY DATABASE 和 VIEW ANY DEFINITION。我为我正在比较的数据库添加了一个具有 PUBLIC 数据库角色成员资格的用户。我认为服务器级别的权限就足够了,但我错了。除了 2014 数据库之外,我还在 2008R2 数据库上执行此操作。

在 2014 数据库上,我还授予了服务器级权限 SELECT ALL USER SECURABLES。错误仍然存​​在。

我在数据库上授予用户 SELECT 权限。错误仍然存​​在。

我删除了 SELECT 权限并将用户添加到 data_reader 数据库角色。查询已解决,但未返回任何数据(运行与系统管理员相同的查询返回 130 多行)。现在我完全困惑了。

我在 sys.sql_expression_dependencies 上明确授予用户 SELECT 权限,结果与上述相同。

在研究了这些权限后,共识似乎是将 SELECT 授予数据库上的用户与将用户添加到 data_reader 角色相同。但显然情况并非如此。我想创建一个具有最小权限集的登录/用户来实现比较。

如何在 mssqlsystemresource 中授予对 sys.sql_expression_dependencies 视图的访问权限,而不授予对整个数据库的 data_reader 访问权限?有没有办法只在 mssqlsystemresource 上授予 SELECT 权限?

**注意 - 我在 SE 上阅读了一些关于 mssqlsystemresource 的其他帖子,但它们与此无关:

  • 我没有拒绝任何分配给此登录名/用户的内容
  • PUBLIC 角色(服务器或数据库)中的成员身份无关紧要,因为权限与“已知良好”服务器上的权限相同。
  • 我不想让用户对整个数据库拥有全面的 SELECT 权限。

Aar*_*and 7

不确定你一路上绊倒的地方,但这对我有用:

CREATE LOGIN permtest WITH PASSWORD = 'x', CHECK_POLICY = OFF;
GO
USE somedatabase;
GO
CREATE USER permtest FROM LOGIN permtest;
GO
Run Code Online (Sandbox Code Playgroud)

根据此页面,用户需要SELECTsys.sql_expression_dependenciesVIEW DEFINITION数据库的权限。

在我的实验中,以下内容允许用户从视图中进行选择,但它返回 0 行,因为他们无法查看定义(包括依赖链):

GRANT SELECT ON sys.sql_expression_dependencies TO permtest;
Run Code Online (Sandbox Code Playgroud)

为了实际查看 中的任何关系somedatabase,我还必须添加以下内容:

GRANT VIEW DEFINITION ON DATABASE::floob TO permtest;
Run Code Online (Sandbox Code Playgroud)

我找不到任何方法来使其更细化(VIEW/DENY定义适用于单个对象,但没有数据库级别的权限,我仍然看不到目录视图中的任何行,并且DENY没有阻止对象显示在目录视图甚至没有阻止我查看定义)。我觉得 SQL Server 无论如何都很难解决这个粒度 - 如果您有一个引用表的视图,如果您对视图授予授权并拒绝表,目录视图应该如何显示,反之亦然?

如果您不想授予VIEW DEFINITION数据库EXECUTE AS OWNER权限,则创建使用 的过程,从目录视图中选择(过滤?)行,并授予用户(当然,也可以是角色)对该过程的执行权限.

CREATE PROCEDURE dbo.GetDependencies
WITH EXECUTE AS OWNER
AS
BEGIN
  SELECT is_schema_bound_reference --, ...
    FROM sys.sql_expression_dependencies;
END
GO

GRANT EXECUTE ON dbo.GetDependencies TO permtest;
Run Code Online (Sandbox Code Playgroud)