查看存储过程/函数/视图/触发器定义需授予用户哪些权限
查看存储过程、函数、视图、触发器定义的权限配置
常规场景的基础权限要求
当用户本身对目标对象持有对应操作权限时,无需额外授权即可查看对象定义:
- 存储过程、标量/表值函数:持有对象的
EXECUTE权限即可查看定义 - 视图:持有对象的
SELECT权限即可查看定义 - 触发器:作为依附于表/视图的从属对象,持有其所属父表/父视图的
SELECT或ALTER任意一种权限,即可查看对应触发器的定义
无SELECT/EXECUTE权限时的定义查看配置
如果需要允许用户查看自身没有操作权限的对象定义,核心是授予VIEW DEFINITION权限,该权限支持按不同粒度灵活配置:
- 单对象粒度授权(最小权限原则推荐):仅开放指定单个对象的定义查看权限,授权语法示例:
-- 给用户UserA授予指定存储过程的定义查看权 GRANT VIEW DEFINITION ON OBJECT::dbo.YourProcedureName TO UserA; -- 授权视图、函数、触发器的语法完全一致,替换对应对象名即可 - 架构粒度授权:需要开放某个架构下所有对象的定义查看权时使用,授权后用户可查看该架构下所有表、视图、存储过程、函数、触发器的定义,不受对象本身操作权限限制,示例:
GRANT VIEW DEFINITION ON SCHEMA::dbo TO UserA; - 数据库粒度授权:需要开放整个数据库下所有用户自定义对象的定义查看权时使用,示例:
注意该层级授权不会开放数据库内系统对象的定义查看权限。GRANT VIEW DEFINITION ON DATABASE::YourDatabaseName TO UserA; - 服务器粒度授权(非必要不推荐):给登录名授予
VIEW ANY DEFINITION服务器级权限后,该登录名映射的所有数据库用户,可以查看实例内所有数据库的所有对象(含系统对象)定义,权限覆盖范围极大,仅适合数据库管理员等特殊角色使用。
注意:如果对象创建时指定了
WITH ENCRYPTION加密选项,无论授予何种权限,都无法通过系统视图、客户端管理工具等常规方式查看对象明文定义,该限制属于对象加密机制,与权限配置无关。
内容的提问来源于stack exchange,提问作者Orlando Colamatteo
相关产品推荐
相关产品推荐

