关于 AUTH_ID 的遭遇

        前两天帮朋友,看一段代码。就是在过程中动态的创建一个表,然后在插入一些数据。整个过程就是自己在学习存储过程做测试用的。不过,就这一段简单的代码让我卡了两天的时间。以下是出错代码:
  
create or replace procedure p_insert_date(date1 varchar2) as
  date2 date; 
  v_sql varchar2(200);                          --定义变量
begin
  execute immediate 'truncate table test_date'; --删除表
v_sql:='create table '||'test_date'||' ('||
         'v1 varchar2(15),'||
         'v2 varchar2(15),'||
         'v3 varchar2(15),'||
         'v4 varchar2(15),'||
         'v5 varchar2(15),'||
         'v6 varchar2(15),'||
         'v7 varchar2(15),'||
         'v8 varchar2(15),'||
         'v9 varchar2(15)'||' )';
  execute immediate v_sql;                    --动态建表
  date2 := to_date(date1, 'yyyymmdd');
  while date2 < to_date(20080117, 'yyyymmdd') loop
    insert into test_date
    values
      (to_char(date2, 'yyyy') || '年' || to_char(date2, 'mm') || '月' || to_char(date2, 'dd') || '日',
       to_char(date2, 'yyyymm'),
       to_char(date2, 'mm'),
       to_char(date2, 'q'), --v4
       to_char(date2, 'ww'), --v5
       to_char(date2, 'd'), --v6
       (case
         when to_char(date2, 'd') not in ('6', '7') then
          '0'
         else
          '1'
       end), --v7
       to_char(add_months(date2, -1), 'yyyymm'),
       to_char(date2, 'yyyymm') || to_char(last_day(date2), 'dd'));
    date2 := date2 + 1;
  end loop;
  commit;
end p_insert_date;

一直报错,最后加了个  AUTH_ID CURRENT_USER 才给解决掉。
查文档发现用户拥有的role权限不能在存储过程中使用。有两个解决办法:
一,显示授予系统权限
   上面可显示授予权限,如grant create table to user; 来解决;
二,在创建procedure时,加上Authid Current_User关键字来使用role权限.
 最后搜了一些这方面的资料 学习一下!
 AUTH_ID CURRENT_USER|DEFINER
涉及到多模式设计下,程序的调用者权限VS执行者权限的问题。
1. 调用者权限(AUTH_ID CURRENT_USER)的优点
调用者权限的子程序能让我们重用代码并将程序逻辑集中化。它们对于那些在不同的模式中存储数据的应用程序来说特别有用。这种情况下,多个用户可以使用一份代码来管理他们的数据。
      假设有一个使用定义者权限(DR)的过程analyze用于分析公司的销售情况。为了提供本地销售的汇总信息,过程分析必须访问每个地区的sales表。所以,如下表所示,过程必须放在每一个地区的站点中。这就会引起一个关于维护的问题。
   要解决这个问题,公司就得在总部设置一个调用者权限的过程analyze。现在,如下图所示,所有地区的站点都可以使用同一个过程来查询它们自己的sales表了。
     如果要严格限定对敏感数据的访问,我们可以使用调用者权限的子程序来调用定义者权限子程序。假设总部要用过程analyze来计算销售佣金并更新payroll表。
    问题是analyze的当前用户并不能直接访问存储了雇员工资和其他敏感数据的payroll表。如下图所示,解决方法就是用过程analyze调用定义者权限的calc_comm过程,变相地更新payroll表。
2. 执行当前子程序的用户是谁--CURRENT_USER|DEFINER相互调用的问题.
        在一系列调用中,如果一个调用者权限的子程序是第一个被调用的子程序,那么当前用户就是会话用户。这样的状态会一直保持到一个定义者权限子程序被调用,这时,定义者权限的所有者就成了当前用户。如果定义者权限的子程序调用了调用者权限的子程序,它们就会按定义者权限来执行。当定义者权限的子程序退出时,控制权又回重新归还给原先的当前用户。

来源: http://blog.csdn.net/rcom10002/archive/2007/09/02/1769443.aspx
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26622598/viewspace-717396/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26622598/viewspace-717396/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值