根据 MSDN:VIEW DEFINITION
权限允许用户查看授予权限的安全对象的元数据。 但是,VIEW DEFINITION
权限不授予对安全对象本身的访问权限。 例如,仅被授予对表的 VIEW DEFINITION
权限的用户可以在 sys.objects
目录视图中查看与该表相关的元数据。 但是,如果没有 SELECT
或 CONTROL
等附加权限,用户将无法从表中读取数据。
如果您的用户在数据库中具有 db_reader
权限并且他/她试图生成表/对象的模式,他将无法执行此操作。 您必须允许他/她这样做,这就是 VIEW DEFINATION
提供帮助的地方。
USE [master]
GO
CREATE LOGIN [TestLogin] WITH PASSWORD=N'testing', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [AdventureWorks2012]
GO
CREATE USER [TestLogin] FOR LOGIN [TestLogin]
GO
USE [AdventureWorks2012]
GO
ALTER ROLE [db_datareader] ADD MEMBER [TestLogin]
GO
现在使用 TestLogin 登录到您的 SQL Server 并尝试为表生成架构,您将无法执行此操作。 让我们授予查看定义权限。
- Database level
- Schema Level
- Individual Entity
让我们用 TSQL 脚本查看每个权限
--允许为 HumanResources Schema 下的所有对象生成脚本
GRANT VIEW DEFINITION ON SCHEMA :: HumanResources TO TestLogin;
--允许为 AdventureWOrks2012 数据库下的所有对象生成脚本
GRANT VIEW DEFINITION ON DATABASE :: AdventureWOrks2012 TO TestLogin;
--允许为 Person.Address 表生成脚本
GRANT VIEW DEFINITION ON OBJECT :: Person.Address TO TestLogin;
VIEW DEFINITION权限
可以在以下级别授予 VIEW DEFINITION
权限:
- Server 作用域
- Database 作用域
- Schema 作用域
- 单独实体(Individual entities)
Server 作用域
在此作用域内授予的 VIEW ANY DEFINITION
权限,可有效地取消被授权者基于权限的元数据访问权限。 这意味着被授权者可以看到 SQL Server 实例中的所有元数据,除非被授权者在数据库范围、架构范围或单个实体(如表)中被拒绝 VIEW DEFINITION
或 CONTROL
权限。
权限名称在服务器作用域内为
VIEW ANY DEFINITION
,但在所有其他作用域内为VIEW DEFINITION
。
Database 作用域
在此作用域内授予的 VIEW DEFINITION 权限可有效地取消指定数据库中被授权者基于权限的元数据访问权限。这意味着被授权者可以看到执行 GRANT
语句的数据库上下文中的所有元数据,除非被授权者在架构作用域内或针对单独实体(例如表)中被拒绝 VIEW DEFINITION
或 CONTROL 权限。
Schema 作用域
使用在此作用域内授予的 VIEW DEFINITION
权限,被授权者可以查看指定架构中包含的所有对象的所有元数据,除非被授权者被拒绝对架构中的单个实体具有 VIEW DEFINITION
或 CONTROL
权限。
单独实体(Individual entities)
授权个别实体的 VIEW DEFINITION
,被授权者可以查看指定实体的元数据。
您可以向用户授权对安全对象(例如表)的 VIEW DEFINITION
权限。 这使用户可以查看表的元数据以及与表相关的任何子组件,例如触发器、约束和索引。