关闭

oracle authid current_user详解

标签: oracleAUTHID CURRENT_USERAUTHID DEFINER调用者权限定义者权限
8297人阅读 评论(0) 收藏 举报
分类:

在编写PLSQL程序时,对于授权的考虑很重要。ORACLE PLSQL中提供两种授权选择:

--AUTHID DEFINER (定义者权限):指编译存储对象的所有者。也是默认权限模式。

--AUTHID CURRENT_USER(调用者权限):指拥有当前会话权限的模式,这可能和当前登录用户相同或不同(alter session set current_schema 可以改变调用者Schema)

来看下官方的解释:

By default, stored procedures and SQL methods execute with the privileges of their owner, not their current user. Suchdefiner's rights subprograms are bound to the schema in which they reside, allowing you to refer to objects in the same schema without qualifying their names. For example, if schemas HR and OEboth have a table called departments, a procedure owned by HR can refer to departments rather than HR.departments. If user OE calls HR's procedure, the procedure still accesses the departments table owned by HR.

A more maintainable way is to use the AUTHID clause, which makes stored procedures and SQL methods execute with the privileges and schema context of the calling user. You can create one instance of the procedure, and many users can call it to access their own data.

默认情况,程序以其拥有者身份(定义者)执行。定义者权限的程序与其所在模式绑定,调用对象不需要加上模式完整名称。例如,假如模式HR和OE都有deparments表,HR拥有的程序可直接调用departments而不用HR.departments.而如果OE调用HR的程序,程序仍然调用的是HR的departments.

如果希望不同模式(schema)调用相同的程序却可以操作各自拥有的对象,就可以在定义程序的时候加上AUTHID CURRENT_USER。

                                 

下面举例说明2中授权机制:

---------------------------------------------------------------

C:\Users\Administrator>sqlplus sys/oracle@orcl as sysdba
查看一下sys模式下user_tables表记录数:
sys@ORCL> select count(*) from user_tables;

  COUNT(*)
----------
       972
创建2个对比函数:

get_count is default auth mode. When another user calls this function it will use SYS's user_tables

sys@ORCL> CREATE OR REPLACE FUNCTION get_count RETURN NUMBER AUTHID DEFINER IS
  2      table_count NUMBER;
  3    BEGIN
  4      SELECT COUNT(*) INTO table_count FROM user_tables;
  5
  6      RETURN table_count;
  7    END;
  8    /

函数已创建。

get_count2 is CURRENT_USER auth mode. When another user calls this function it will use its user_tables

sys@ORCL>  CREATE OR REPLACE FUNCTION get_count2 RETURN NUMBER AUTHID CURRE
NT_USER IS
  2      table_count NUMBER;
  3    BEGIN
  4      SELECT COUNT(*) INTO table_count FROM user_tables;
  5
  6      RETURN table_count;
  7    END;
  8    /

函数已创建。

下面进行授权操作:

sys@ORCL> grant execute on get_count to hr;

授权成功。

sys@ORCL> grant execute on get_count2 to hr;

授权成功。

sys@ORCL> conn hr/hr;
已连接。
hr@ORCL> SELECT sys.get_count FROM dual;

 GET_COUNT
----------
       972

hr@ORCL> SELECT sys.get_count2 FROM dual;

GET_COUNT2
----------
         7

结果一目了然。

定义者权限模式确保我们能控制对集中式DML操作。
而调用者权限模式则确保我们能控制对分布式数据的DML操作。


详细信息请参考资料:点击打开链接http://download.csdn.net/detail/indexman/6642375




-----------------------------------

Dylan    presents.


2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

ORA-01031 权限不足-过程中DBA 角色用户无法执行DDL

Oracle的存储过程,是我们使用数据库应用开发的重要工具手段。在存储过程中,我们大部分应用场景都是使用DML语句进行数据增删改操作。本篇中,我们一起探讨一下数据定义语句DDL在存储过程中使用的细节和...
  • liqfyiyi
  • liqfyiyi
  • 2015-04-11 12:55
  • 2231

存储过程中创建表 报ORA-01031: insufficient privileges权限不足

问题在PL/SQL中新建存储过程Procedure,然后在右键,点击测试的时候,调试到建表的那一行就报错:ORA-01031: insufficient privileges! 存储过程:creat...
  • aiynmimi
  • aiynmimi
  • 2016-10-19 15:36
  • 3678

flask学习笔记(-用户)

Flask-Login:用户 登陆会话 安装Flask扩展 pip install flask-login 若想使用Flask-Login扩展,必须实现以下方法: Flask-Log...
  • SUN_DRAGON
  • SUN_DRAGON
  • 2016-06-23 13:18
  • 2300

oracle用Authid Current_User 定义的建表过程plsql可执行别的用户对象,但是job却不能调用

说明: procedure 本身可以执行.但是放到job中执行错误 ORA-12012: 自动执行作业 187 出错 ORA-01031: 权限不足 ORA-06512: 在"EMMA.PACK...
  • jasontome
  • jasontome
  • 2011-10-19 13:46
  • 874

oracle过程中的authid definer/current_user选项使用

Oracle 10g 中创建函数,存储过程,程序包都存在这个invoker_rights_clause选项 authid definer/current_user 以下为文档中的解释 cre...
  • liangyike
  • liangyike
  • 2012-04-16 15:00
  • 576

oracle Authid Current_User

我在一些技术论坛里面,常常看到有朋友问这种问题: 为什么我的用户具有DBA权限,却无法在存储过程里面创建一张普通表呢?   下面就结合具体案例来谈谈这个问题:   SQL> conn eric...
  • launch_225
  • launch_225
  • 2012-07-30 12:35
  • 510

Oracle:Authid Current_User的使用

我们知道,用户拥有的role权限在存储过程是不可用的。遇到这种情况,我们一般需要显式授权,如grant create table to usera;但这种方法太麻烦,有时候可能需要进行非常多的授权才能...
  • heqiyu34
  • heqiyu34
  • 2012-06-27 15:25
  • 550

ORACLE AUTHID DEFINER与AUTHID CURRENT_USER介绍

转自:http://www.2cto.com/database/201312/261221.html
  • zml19910422
  • zml19910422
  • 2014-06-13 13:42
  • 385

使用 Authid Current_User 为调用者授权

Authid Current_User 是调用者权限。 oracle DB下面有2种执行的权限:定义者权限和调用者权限。 默认都是定义者权限。声明Authid Current_User后就是调用者权限...
  • liqfyiyi
  • liqfyiyi
  • 2012-04-09 17:09
  • 1907

plsql可执行别的用户对象,过程却不行(AUTHID CURRENT_USER)

问题描述: 如表rm_circuit是a用户的,授予b用户select,insert,update,delete权限,在b用的存储过程中执行dbms_stats.gather_table_stats...
  • jasontome
  • jasontome
  • 2011-10-19 13:48
  • 427
    个人资料
    • 访问:1414489次
    • 积分:10274
    • 等级:
    • 排名:第1931名
    • 原创:161篇
    • 转载:48篇
    • 译文:22篇
    • 评论:113条
    博客专栏
    最新评论