来源《Oracle plsql 程序设计》
写存储过程时经常由于执行权限导致得不到想要的数据,现在详细看一下;
Oracle数据库为PL/SQL程序提供了两种对象许可模型,默认的是定义者权限(AUTHID DEFINER),使用这种模型,存储过程是运行在他的所有者权限下的;
1 定义者权限模型(AUTHID DEFINER)
执行存储过程前要前,程序要先编译并且保存到数据库中。一个程序通常保存在一个模式或者说一个数据库用户下,程序中可能会用到其他用户下的对象。
定义者权限模型的规则
1.程序中的任何外部引用都必须在编译时被解析,所使用的权限是编译时所在模式被直接赋予的权限;
2.在编译存储过程时,数据库角色会被忽略。这个程序需要的所有权限都必须直接授予这个过程的定义者;
3.当执行定义者权限模型编译的过程时,过程执行的sql都是运行于拥有这个过程的模式的权限之下;
4.尽管编译过程需要直接授权,可以把执行程序所需要的EXECUTE权限授予其他模式或角色;
使用定义者权限模型控制对底层数据的访问:
所有的订单处理数据放在OEData模式下;
所有的订单处理代码放在ODCode模式下,且编译Order_Mgt的权限直接授予了OECode,这个包允许下订单和取消订单;
为了保证正确更新订单,不允许除了OEcode以外的其他任何模式直接访问这个表。比如,加入Sam_Sales模式需要关闭旧订单,他不能通过Close_Old_Orders执行删除语句,必须通过调用Order_Mgt.cancel完成删除订单任务。
定义者权限模型的好处
1.能控制对底层结构的