Oracle定义者权限与调用者权限(AUTHID CURRENT_USER)
参考:
http://blog.itpub.net/7607759/viewspace-166557/
http://blog.itpub.net/7607759/viewspace-166558
http://blog.163.com/l_yongfei/blog/static/265673042009420103210297/
正如大家所知,Oracle从8i开始引入了调用者权限体系结构,之前一直使用定义者权限体系结构。
一、简单介绍一下二者的使用方法
oracle创建存储过程时,若不指定authid参数,则调用权限验证默认是definer,也就是存储过程执行时,以这个存储过程的创建者的身份来验 证存取权限;可以在创建存储过程时指定authid为current_user,从而在执行存储过程时根据当前调用存储过程的用户权限来验证。
举个例子说明:
比如有两个用户test和user1,test用户下有个表user1table,用户user1只有这个表的select权限。test创建了一个存储 过程testproc,使用默认的authid调用方式,存储过程内容为“insert into user1table ....”,然后使用grant execute on testproc to user1将执行权限赋予user1,那么user1就可以调用这个存储过程向user1table添加数据。注意:此时user1并没有对表 user1table的insert权限,但由于testproc执行的时候,是根据test用户的权限来验证的,因此insert语句不会出现权限不足 的提示。
假如创建testproc是添加了authid current_user,则当user1调用test.testproc存储过程时,就会报两个错误:一是user1table未定义,二是对 user1table没有insert权限。对于第一个问题,原因是user1table仅在test用户模式下,user1用户不能直接引用,可以在定 义testproc时使用test.user1table方式;对于第二个问题,由于user1没有对user1table的insert权限,因此无法 执行这个存储过程,除非给user1用户增加user1table表的insert权限。
二、定义者权限与调用者权限之间差异
关于定义者权限与调用者权限之间的相通点或者是各自优势本文不做探讨,这里仅描述调用者权限与定义者权限之间的差异,在我看来,主要有三个方面:
>
>
>
>
>
>
> >
>
>
>
>
>
>
>
>
>
>
>
> >
>
>
>
>
>
>
>
>
>
>
>