IQ 16引入了新的"基于角色"的安全控制特性,作为其中一部分的系统存储过程的权限模型也发生了变化。本文将结合理论说明和一些实际的例子向大家介绍这些变化。
1. IQ 16系统存储过程权限模型概述
IQ 16之前的版本,一个特权系统存储过程在运行时自动具有存储过程属主(系统存储过程的属主是dbo) 所具有的特权,这种系统存储过程的权限模型叫做“SYSTEM PROCEDURE DEFINER(系统存储过程定义者)”模型。而从IQ 16开始,特权系统存储过程在运行时具有调用它的用户所具有的权限,这种系统存储过程的权限模型叫做“SYSTEM PROCEDURE INVOKER(系统存储过程调用者)”模型。需要注意的是:IQ 16中只是针对系统存储过程的权限模型发生了改变,而对于用户定义的存储过程没有变化。
在IQ 16之前的"
系统存储过程定义者"模型下,当显示地为用户授予某个系统存储过程的执行权限后,该用户在执行这个系统存储时所需要的操作权限自动从它的属主(即系统存储过程的创建者)继承,因此可以允许这个用户成功执行。
在IQ 16新的"
系统存储过程调用者"模型下,每个系统存储过程的执行权限被授予PUBLIC角色(组)。在缺省情况下,每个用户都是PUBLIC角色的成员,因此每个用户都能够自动继承系统存储过程的执行权限,而在系统过程执行时所需要的操作权限则不会被继承下来。为了能够让用户成功执行系统存储过程,就需要授予存储过程所需要的操作权限。
对于从先前版本升级到IQ 16的数据库,为了最大程度避免由于升级后导致原先的存储过程执行失败或者原先具有执行某些系统储存过程的用户在执行它们时失败的情况,IQ 16对于升级而来的数据库缺省采用
混合模型(combination model),即:IQ 16版本之前就具有的系统存储过程仍然采用"系统存储过程定义者"模型,而对于在IQ 16或后续版本中新增加的系统存储过程将采用"系统存储过程调用者"模型。
如果在升级前你不能确定系统存储过程权限模型的变化所造成的影响,那么在执行数据库升级时应该使用缺省的“混合模型”(即执行ALTER DATABASE UPGRADE语句时不带SYSTEM PROCEDURE AS DEFINER字句)。如果在升级后你能够确定,系统可以采用IQ 16新的"系统存储过程调用者"权限模型,那么可以执行ALTER DATABASE UPGRADE SYSTEM PROCEDURE
AS DEFINER OFF 语句把缺省的混合模型改为调用者模型。
一般的原则是:对于从先前版本升级到IQ 16的数据库仍然采用"系统存储过程定义者"模型,以保证兼容性;而对于IQ 16中新创建的数据库,建议使用"系统存储过程调用者"模型。
2
. 如何查看当前IQ 16数据库采用了哪种权限模型
执行如下查询可以得到当前IQ 16数据库使用的系统过程权限模型:
select IF ((HEXTOINT(substring(db_property('Capabilities'),1,length(db_property('Capabilities'))-20)) & 8) = 8)
THEN 'Invoker Model(1)'
ELSE 'Combination Model(0)'
END IF AS "Security Model"
3
. 如何在IQ 16"系统存储过程调用者"模型下为普通用户授予系统存储过程权限
对于使用"系统存储过程调用者"模型下的特权系统存储过程,缺省情况下,普通用户都具有执行权限,不用单独授予执行权限。但是需要为普通用户授予相应特权系统过程执行时需要的操作权限,具体方法如下:
(1) 首先执行sp_proc_priv 'system procedure name' 系统存储过程,查看需要的操作权限,例如:
sp_proc_priv 'sp_iqtablesize'
返回如下:
Procedure Name Privileges
========= ======
sp_iqtablesize MANAGE ANY DBSPACE, ALTER ANY TABLE, ALTER ANY OBJECT
sp_proc_priv 'sp_iqtable'
返回如下:
Procedure Name Privileges
sp_iqtable No Privilege Required --即sp_iqtable不需要特殊操作权限就可以执行
(2) 然后执行如下语句,为用户授予相应的操作权限
授予操作权限的语句的通用语法如下:
GRANT system_privilege_name TO grantee [,...]
例如:
grant MANAGE ANY DBSPACE, ALTER ANY TABLE, ALTER ANY OBJECT to user3
在执行上述授权后,user3用户就可以正常执行sp_iqtablesize存储了:
sp_iqtablesize 'DBA.sale' -- user3 可以正常执行这个存储过程。
阅读(3900) | 评论(0) | 转发(0) |