CLR 集成安全性中的链接
本节介绍使用 Transact-SQL 或某种托管语言的用户代码片段怎样才能在 SQL Server 中相互调用。对象之间的这些关系称为链接。
调用链接
调用链接对应于代码调用,该调用要么来自调用对象的用户(比如调用存储过程的 Transact-SQL 批),要么来自公共语言运行库 (CLR) 存储过程或函数。调用链接将导致检查对被调用方的 EXECUTE 权限。
表访问链接
表访问链接对应于在表、视图或表值函数中检索或修改值。它们类似于调用链接,但它们在 SELECT、INSERT、UPDATE 和 DELETE 权限方面有较粗粒度的访问控制权。
门链接
门链接意味着,在执行期间,一旦已建立对象关系,则不跨越该对象关系检查权限。当两个对象(例如,对象 x 和对象 y)之间有门链接时,仅在创建对象 x 时才检查对象 y 以及从对象 y 访问的其他对象上的权限。创建对象 x 时,将针对 x 的所有者检查 y 上的 REFERENCE 权限。在执行时(例如,当某人调用对象 x 时),则不检查 y 或它静态引用的其他对象的权限。在执行时,将检查对象 x 自身的合适权限。
门链接始终与两个对象之间的元数据依赖性配合使用。该元数据依赖性是在 SQL Server 目录中建立的关系,它使得只要另一个对象依赖于某个对象则无法删除该对象。
如果向很多依赖性对象授权是不合适或不可管理的,则需要使用门链接。门链接在 SQL Server 2000 中用于计算列和全文索引列。从 SQL Server 2005 开始,在定义到 CLR 程序集(例如,CLR 过程、触发器、函数、类型和聚合)的 Transact-SQL 入口点的对象与其中定义它们的程序集之间引入了门链接。对应这些对象的门安全性暗含如下法则:为了调用在 CLR 程序集中定义的 Transact-SQL 入口点,调用方只需对该 Transact-SQL 入口点有合适的权限。调用方不必对该程序集或它静态引用的任何其他程序集拥有权限。在创建 Transact-SQL 入口点时将检查程序集上的权限。
SQL Server 基于授权的安全性
下面是对调用基于 CLR 的数据库对象和这些对象之间的调用进行 SQL Server 安全检查所基于的基本规则;前三个规则定义了将检查哪些权限和根据哪个对象进行检查;第四个规则定义了根据哪个执行上下文来检查权限。
所有调用都需要 EXECUTE 权限,除非调用发生在相同对象内;这意味着相同程序集内的调用不需要进行任何权限检查。权限检查在执行时进行。
创建调用对象时,门链接需要拥有对被调用方的 REFERENCE 权限。创建对象时,系统将检查调用对象的所有者是否有此权限。
表访问链接需要拥有对被访问的表或视图的相应的 SELECT、INSERT、UPDATE 或 DELETE 权限。
系统根据当前执行上下文检查此权限。可以用不同于调用方的执行上下文创建过程和函数。程序集始终以根据它定义的过程、函数或触发器的执行上下文来创建。