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(我们即将升级)中的依赖项。
2012 年联机丛书主题“获取有关视图的信息”指出此特定任务所需的权限是:
VIEW DEFINITION数据库权限;和SELECTsys.sql_expression_dependencies 的权限请注意,需要数据库级别VIEW DEFINITION才能允许用户查看sys.sql_expression_dependencies; 对象级别VIEW DEFINITION和SELECTDMV 将不起作用(您将收到一个空结果集)。
例子:
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_entities和sys.dm_sql_referenced_entities。
| 归档时间: |
|
| 查看次数: |
4946 次 |
| 最近记录: |