我有一个 SQL 视图
[schemaA].[ViewNameA]
,它构建在具有不同模式的其他视图上:
[schemaB].[ViewNameB]
[schemaC].[ViewNameC]
[schemaD].[ViewNameD]
我正在尝试为功能帐户“USERXYZ”提供对
[schemaA].[ViewNameA]
的访问权限:
GRANT SELECT ON [schemaA].[ViewNameA] to USERXYZ
当我使用此“USERXYZ”帐户登录并尝试在
[schemaA].[ViewNameA]
上运行选择时,我收到如下错误:
对象“ViewNameB”、数据库“db1”、架构“schemaB”的 SELECT 权限被拒绝。
此帐户“USERXYZ”在 db1 上具有“public”角色。如何在不授予
[schemaA].[ViewNameA]
和其他人选择的情况下提供对 [schemaB].[ViewNameB]
的访问权限?
我尝试管理架构权限 -
ALTER AUTHORIZATION
- 但随后用户拥有对 schemaB 下所有视图的权限。
这个错误是字面上告诉你这里的问题。
USER
没有其他对象对 SELECT
的权限。从评论中您可以看出,这些对象位于同一数据库中,但由不同的 USER
拥有,因此权限链不起作用。因此,为什么不只是 GRANT
USER
也从该对象获得 SELECT
的权限呢?正如您演示的那样,您已经知道语法,但要确认:
GRANT SELECT ON [schemaB].[ViewNameB] to USERXYZ;
但是,在相关说明中,您不应该嵌套视图;这可能会产生性能问题。相反,您应该在 ViewNameA
中引用需要引用的对象,而不是引用
ViewNameB
。阅读嵌套视图是一个好的数据库设计吗?可能值得。