ITPub博客

首页 > 数据库 > Oracle > 封装dbms_xplan.display_cursor时遇到的权限问题

封装dbms_xplan.display_cursor时遇到的权限问题

原创 Oracle 作者:mcszycc 时间:2016-10-24 21:53:16 0 删除 编辑
     oracle提供的dbms_xplan包用来显示执行计划那是特别的好,但由于采用了管理函数实现,所以调用时需要加上table()函数,这样就不能直接作为一列返回了,而我恰好有这样一个需求,要显示一个SQL的完整文本与执行计划,而且SQL肯定是多行的,SQL的完整文本有CLOB保存,很好取,执行计划却不能直接调用dbms_xplan.display_cursor了,所以就想进行一层封装,让它也返回CLOB,写了一点代码如下:
    

点击(此处)折叠或打开

  1. create or replace noneditionable function mysqlplan(p_sqlid in varchar2) return clob authid current_user as
  2.        myplan clob;
  3. begin
  4.   for pto_row in (select plan_table_output as pto from table(dbms_xplan.display_cursor(p_sqlid))) loop
  5.     myplan:=myplan || pto_row.pto || chr(13);
  6.   end loop;
  7.   return myplan;
  8. end;
     其中首先是没有加“authid current_user"这一子句的,一跑返回的竟然是”User has no SELECT privilege on V$SQL"!  由于我用的是system用户,肯定是有权限的,直接查也没问题,所以报这个权限问题就让我挺纳闷的了,很早之前曾在TOM大师的一本书上看到了过“定义者权限”与“调用者权限”的概念,但并没有理解得很透彻,而且不应该默认就是当前用户吗?如果system用户定义,却以别的用户调用,那么它用哪个用户呢?这是根据什么规则来的?
      疑问并没完全解开,但加上了“authid current_user"子句之后,运行正常了,小记一下,这事还没完。

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

请登录后发表评论 登录
全部评论

注册时间:2014-07-22

  • 博文量
    41
  • 访问量
    68634