Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2874997
  • 博文数量: 200
  • 博客积分: 2413
  • 博客等级: 大尉
  • 技术积分: 3067
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-01 22:07
文章分类

全部博文(200)

文章存档

2018年(2)

2017年(8)

2016年(35)

2015年(14)

2014年(20)

2013年(24)

2012年(53)

2011年(44)

分类: Oracle

2013-01-08 18:22:16


关于authid current_use
r



遇到了一个问题

load 用户下创建了USER_ALL物化视图,由于业务需要,CSE用户要在存储过程中执行一次USER_ALL物化视图的快速刷新实现数据同步。

存储过程大概如下
create or replace
PROCEDURE PROC_IN_CSE_LOGIN_TEST (
LOG_TIME_ DATE DEFAULT GETDAY(SYSDATE-1))
as
BEGIN
DBMS_MVIEW.REFRESH('load.USER_ALL','FAST');   
COMMIT;
END;

手动执行
exec PROC_IN_CSE_LOGIN_TEST ;

ORA-01031: 权限不足
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2537
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2743
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2712
ORA-06512: 在 "CSE.PROC_IN_CSE_LOGIN_TEST", line 10
ORA-06512: 在 line 1
01031. 00000 -  "insufficient privileges"


解决办法:使用authid current_user

create or replace
PROCEDURE PROC_IN_CSE_LOGIN_TEST (
LOG_TIME_ DATE DEFAULT GETDAY(SYSDATE-1))
authid current_user
is
BEGIN
DBMS_MVIEW.REFRESH('load.USER_ALL','FAST');   
COMMIT;
END;



################################
authid current_user到底是什么意思
#################################

下面是别人总结的:
关于authid current_user

Authid Current_User:以执行过程的用户的权限来处理涉及的对象权限.


这是典型的,数据库中只创建一个存储过程,所有用户都可以使用,但是每个用户使用的时候 只是用自己的权限权限执行,oracle自己的包很多都这样的。

   存储过程默认是用定义者definer 的身份调用的,如果加上AUTHID CURRENT_USER,则用当前登陆的用户权限调用,如果该过程的调用者(而非定义者)被授与系统权限execute any procedure或是被该过程的定义者grant execute on授权的话,不用这个AUTHID CURRENT_USER子句,调用者照样可以使用这个过程。
    另外,在Oracle的存儲過程中,如果涉及到操作不同schema下的對象的時候,可以在不同的schema下寫相同的procedure,但這樣帶來的問題是維護和同步帶來了麻煩,可以在procedure中加上authid current_user,來說明procedure中操作的對象是當前連接用戶的對象而并不是procedure所屬用戶下的對象。

阅读(3770) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~