查看依赖项需要什么权限?

JNK*_*JNK 5 sql-server sql-server-2008-r2 dependencies

在不久的将来,我的公司将转向更严格的安全模型。

作为其中的一部分,我们正在将特定服务器更改为新模型并测试我们所有现有的流程。我经常使用的一个进程利用 SMO 框架按依赖顺序编写数据库对象的脚本,因此我们可以在另一台服务器上运行这些脚本。

依赖顺序部分非常重要,因为我们有很多嵌套对象(想想引用其他视图的视图)。

使用新的安全模型后,此脚本停止正常工作。

我也在 SSMS(针对 2008r2 实例的 SSMS 2012)中进行了测试,并且View Dependencies在引用同一数据库中另一个视图的视图上使用不会在Objects on which [this view] depends.

更令人不安的是,如果我sp_depends在有问题的视图上运行,我确实会得到一个准确的依赖项列表。

我做了一些研究,找不到明确的答案,所以我希望有人能帮助我:

用户需要哪些特定权限才能准确查看 SQL Server 2008r2 和/或 SQL Server 2012(我们即将升级)中的依赖项。

Pau*_*ite 8

2012 年联机丛书主题“获取有关视图的信息”指出此特定任务所需的权限是:

请注意,需要数据库级别VIEW DEFINITION才能允许用户查看sys.sql_expression_dependencies; 对象级别VIEW DEFINITIONSELECTDMV 将不起作用(您将收到一个空结果集)。

例子:

USE Sandpit;
GO
CREATE VIEW dbo.V1 AS SELECT 1 AS const;
GO
CREATE VIEW dbo.V2 AS SELECT v.const FROM dbo.V1 AS v;
GO
CREATE USER Bob WITHOUT LOGIN;

-- These two permissions are not sufficent
GRANT VIEW DEFINITION ON OBJECT::V1 TO Bob;
GRANT VIEW DEFINITION ON OBJECT::V2 TO Bob;

-- This one permission is enough (covers the two above)
GRANT VIEW DEFINITION ON DATABASE::Sandpit TO Bob;

-- Also required
GRANT SELECT ON OBJECT::sys.sql_expression_dependencies TO Bob;
GO
EXECUTE AS USER = 'Bob';
GO
SELECT OBJECT_DEFINITION(OBJECT_ID(N'V1', N'V'));
SELECT OBJECT_DEFINITION(OBJECT_ID(N'V2', N'V'));

-- Show DMV info for the test views
SELECT
    referencing_object_name = OBJECT_NAME(sed.referencing_id),
    sed.referencing_class_desc,
    sed.is_schema_bound_reference,
    sed.referenced_class_desc,
    sed.referenced_schema_name,
    sed.referenced_entity_name
FROM sys.sql_expression_dependencies AS sed
WHERE
    sed.referenced_id = OBJECT_ID(N'dbo.V1', N'V');
GO
REVERT;
GO
DROP USER Bob;
DROP VIEW dbo.V1, dbo.V2;
Run Code Online (Sandbox Code Playgroud)

关于sp_depends:只需要public角色的成员资格,但已弃用:

此功能将在 Microsoft SQL Server 的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。请改用sys.dm_sql_referencing_entitiessys.dm_sql_referenced_entities