通过编码对象控制对象访问
在数据库管理中,仅依靠 SQL Server 的数据库级安全功能,我们虽能赋予用户访问特定对象的权限,但这种方式不够友好,且缺乏精细控制。数据库级安全最多只能控制对整个表或列的访问。下面我们将介绍如何通过以下几种类型的对象来完全掌控数据库访问。
1. 可用于控制数据库访问的对象类型
- 存储过程和标量函数 :为用户提供数据库的 API,仅展示可在对象级别进行安全保护的操作。
- 视图和表值函数 :当工具无法使用存储过程时,视图可作为数据接口,对用户而言就像普通表一样。从安全角度看,视图和表值函数可通过隐藏列实现数据的垂直分区,或通过提供行级安全实现水平分区。
2. 所有权链的概念
所有权链是一个重要概念。用户能使用存储过程或函数,并不意味着其必须拥有该存储过程所引用的每个对象的权限。只要对象所有者拥有所有被引用对象的架构,所有权链就不会中断,被授予使用该对象权限的用户就能查看任何引用的数据。若所有权链被打破,引用了非同一用户所有的架构中的数据,用户则需要直接被授予对该对象的权限。
3. 存储过程和标量函数的安全性
存储过程和函数的安全性始终在对象级别。这意味着我们能在用户不知情具体实现方式的情况下,赋予其执行多项操作的权限,且用户若没有存储过程,就无法执行这些操作。
在一些公司,存储过程被用作主要的安全机制,要求所有对服务器的访问都不直接对表执行“原始”的 DML 语句。通过封装所有功能的代码,我们可以对存储过程应用权限,从而限制用户的操作。