如何通过视图所有者的带授予选项的VIEW ANY DEFINITION实现用户查询视图?
解决方案
问题核心在于SQL Server视图默认采用调用者权限(EXECUTE AS CALLER):当用户OMEGACAADM查询视图时,会以自身权限访问底层的master.sys.server_triggers,而非视图架构所有者OMEGACA的权限。哪怕所有者拥有VIEW ANY DEFINITION权限,也不会自动传递给调用者。
正确做法是将视图切换为所有者权限上下文,让视图执行时使用架构所有者OMEGACA的权限访问系统对象,具体步骤如下:
1. 修改视图定义,指定执行上下文为所有者
重新创建或修改视图,添加EXECUTE AS OWNER子句:
ALTER VIEW [OMEGACA].[V_SYS_MANAGE_ACC] WITH EXECUTE AS OWNER AS SELECT name, object_id, parent_class, parent_class_desc, parent_id, type, type_desc, create_date,modify_date, is_ms_shipped, is_disabled FROM master.sys.server_triggers WHERE name = 'OMEGACA_ACC' AND parent_class_desc = 'SERVER'
2. 确认架构所有者OMEGACA的权限有效性
确保OMEGACA登录账号已具备访问master.sys.server_triggers的权限——你之前授予的VIEW ANY DEFINITION权限已满足需求,无需额外调整。
3. 验证OMEGACAADM的视图查询权限
确认OMEGACAADM用户已拥有视图[OMEGACA].[V_SYS_MANAGE_ACC]的SELECT权限(你已提前配置)。
完成以上操作后,OMEGACAADM查询该视图时,会以OMEGACA的权限访问底层系统视图,即可正常返回预期数据,无需直接为OMEGACAADM授予VIEW ANY DEFINITION权限。
内容的提问来源于stack exchange,提问作者altink
相关产品推荐
相关产品推荐

