CLR 集成安全性中的链接

本部分介绍如何在 SQL Server 中以 Transact-SQL 或托管语言之一调用用户代码。 对象之间的这些关系称为链接。

调用链接对应于从调用对象(例如调用存储过程的 Transact-SQL 批处理)或公共语言运行时(CLR)存储过程或函数的代码调用。 调用链接会导致 EXECUTE 对被调用方的权限进行检查。

表访问链接对应于检索或修改表、视图或表值函数中的值。 它们类似于调用链接,只是在 SELECT、INSERT、UPDATE 和 DELETE 权限方面具有更精细的访问控制。

封闭链接意味着在执行期间,在建立权限后,不会在对象关系中检查权限。 当两个对象(例如对象 x 和对象 y)之间存在封闭链接时,仅在对象 x 的创建时检查对象 y 和其他对象上访问的对象的权限。 在对象 x 的创建时,REFERENCE针对 x 的所有者检查 y 的权限。 在执行时(例如,有人调用对象 x 时),没有针对它静态引用 的 y 或其他对象检查的权限。 在执行时,将对对象 x 本身检查适当的权限。

封闭链接始终与两个对象之间的元数据依赖关系结合使用。 此元数据依赖项是在 SQL Server 目录中建立的关系,只要另一个对象依赖于该对象,该关系就会阻止删除该对象。

当无法向许多依赖对象授予权限时,封闭链接非常有用或易于管理。 隔离链接在定义 CLR 程序集 Transact-SQL 入口点(例如 CLR 过程、触发器、函数、类型和聚合)和定义它们的程序集之间引入。 对这些对象的封闭安全性意味着,为了调用 CLR 程序集中定义的 Transact-SQL 入口点,调用方只需要对该 Transact-SQL 入口点具有适当的权限。 调用方不需要对该程序集或其静态引用的任何其他程序集具有权限。 在 Transact-SQL 入口点的创建时检查程序集的权限。

SQL Server Authorization-Based 安全性

以下是 SQL Server 安全检查背后的基本规则,用于调用基于 CLR 的数据库对象和基于 CLR 的数据库对象之间的调用:前三个规则定义要检查哪些权限,并针对哪个对象定义权限;第四条规则定义要检查权限的执行上下文。

  1. 除非调用发生在同一对象中,否则所有调用都需要 EXECUTE 权限;这意味着同一程序集中的调用不需要任何权限检查。 在执行时检查权限。

  2. 创建调用对象时,封闭链接需要 REFERENCE 对被调用方具有权限。 创建对象时,会检查调用对象的所有者的权限。

  3. 表访问链接需要对要访问的表或视图具有相应的SELECT权限INSERTUPDATEDELETE或权限。

  4. 根据当前执行上下文检查权限。 可以使用与调用方不同的执行上下文创建过程和函数。 始终使用针对它定义的过程、函数或触发器的执行上下文创建程序集。

另请参阅

CLR 集成安全性