查看: 11697|回复: 9

存储过程访问其他用户表权限不足问题

[复制链接]
论坛徽章:
26
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24夏利
日期:2013-08-13 23:25:29优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11蓝色妖姬
日期:2015-03-19 09:37:00ITPUB年度最佳技术原创精华奖
日期:2015-03-19 09:43:24
跳转到指定楼层
1#
发表于 2012-2-26 16:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qingyun 于 2012-2-26 17:05 编辑

两个用户 USER_A,USER_B
赋予了DBA权限;  其他权限未选;


两个用户都有一张一模一样的表名 TABLE1;


于是在USER_A为当前用户的情况下:

执行:  INSERT INTO  TABLE1 SELECT * FROM USER_B.TABLE1   没问题;

执行:
   BEGIN
      INSERT INTO  TABLE1 SELECT * FROM USER_B.TABLE1;
   END;

也没问题;

执行:
BEGIN
    EXECUTE IMMEDIATE   ' INSERT INTO  TABLE1 SELECT * FROM USER_B.TABLE1';
END;

也没问题;

但是就是不能些存储过程:


create procedure   xxx
as
begin
    INSERT INTO  TABLE1 SELECT * FROM USER_B.TABLE1;   
    EXECUTE IMMEDIATE   ' INSERT INTO  TABLE1 SELECT * FROM USER_B.TABLE1';
end;

上面两句话,任意一句都有问题;

提示   USER_B.TABLE1 不存在;


oracle是用的 oracle 11gR2  


论坛徽章:
26
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24夏利
日期:2013-08-13 23:25:29优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11蓝色妖姬
日期:2015-03-19 09:37:00ITPUB年度最佳技术原创精华奖
日期:2015-03-19 09:43:24
2#
 楼主| 发表于 2012-2-26 16:39 | 只看该作者
本帖最后由 qingyun 于 2012-2-26 17:07 编辑

办法有了,登陆到B用户,执行:
GRANT SELECT ANY TABLE TO USER_A  WITH ADMIN OPTION;

存储过程的权限,和 匿名 PL/SQL 的权限不一样;

经常遇到  begin... end; 可以; 但是写入到存储过程里就不行;

对这个权限原理换不是太明白;


要想让当前用户肆无忌惮的做任何事情;必须把Toad权限选项里的,处了dba的其他200多个权限勾上;那就可以了;我经常这么做;否者经常遇到 sql语句写的好好的;
一旦跑到存储过程了,就提示权限不足;

使用道具 举报

回复
论坛徽章:
26
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24夏利
日期:2013-08-13 23:25:29优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11蓝色妖姬
日期:2015-03-19 09:37:00ITPUB年度最佳技术原创精华奖
日期:2015-03-19 09:43:24
3#
 楼主| 发表于 2012-2-26 16:46 | 只看该作者
比如在A用户下,想创建B用户的表;
begin
EXECUTE IMMEDIATE ' create table USER_B.test (d number)';
end;
这个没问题;

但是 弄成存储过程就不行了,提示没权限;

于是在B用户下执行:

GRANT CREATE TABLE TO USER_A WITH ADMIN OPTION;

然后再回到A用户下,执行:
create procedre xx
as
begin
EXECUTE IMMEDIATE ' create table USER_B.test (d number)';
end;
--该过程里因为是动态语句,所以存储过程创建没问题,但是运行的时候,仍然抱权限不足的错误;


使用道具 举报

回复
论坛徽章:
26
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24夏利
日期:2013-08-13 23:25:29优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11蓝色妖姬
日期:2015-03-19 09:37:00ITPUB年度最佳技术原创精华奖
日期:2015-03-19 09:43:24
4#
 楼主| 发表于 2012-2-26 16:55 | 只看该作者
用:
SELECT * FROM SYS.USER_TAB_PRIVS;
查询出当前用户“额外”赋予的权限;

使用道具 举报

回复
论坛徽章:
57
SQL极客
日期:2013-12-09 14:13:35秀才
日期:2016-01-21 13:42:39秀才
日期:2016-01-13 12:14:26SQL大赛参与纪念
日期:2016-01-13 10:32:19SQL数据库编程大师
日期:2016-01-13 10:30:43秀才
日期:2015-12-14 14:47:54秀才
日期:2015-10-19 15:50:392015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11优秀写手
日期:2014-11-08 06:00:14
5#
发表于 2012-2-26 17:05 | 只看该作者
楼主有时间可以研究一下steven的plsql程序设计,里面专门有一节讨论这个问题。
使用存储过程的时候分成两种权限:
1.定义者权限
2.调用者权限
默认的情况下使用的是定义者权限。
定义者权限要求所有权限是直接授权的,通过角色授权的无效。就好像完全定在了你调用的那个用户下了,你用角色授予的权限完全失效。
而调用者权限就是为了解决定义者权限的一些局限设计的,它访问的是用户所具有的权限包括角色授权的权限。
楼主的问题可以通过调用者权限和动态sql解决,楼主可以百度一下调用者权限。

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
6#
发表于 2012-2-26 19:09 | 只看该作者
可以参考steven pl/sql programming
23.4. Execution Authority Models

使用道具 举报

回复
论坛徽章:
0
7#
发表于 2012-2-26 20:33 | 只看该作者
Oracle规定,在默认的情况下,在调用存储过程用户的角色不起作用,即在执行存储过程时只有Public权限。所以在调用Create table时,会有权限不足的提示。

存储过程分为两种,即DR(Definer's Rights ) Procedure和IR(Invoker's Rights ) Procedure。比如说用户sh创建了删除表mytable的存储过程drop_table(),当用户sh调用时,删除用户sh下的表mytable;如果是另一个用户scott调用呢?是删除用户scott下的mytable表呢,还是删除用户sh的mytable呢?另外,如果存储过程中包含建表语句,不管是用户sh还是用户scott调用都会失败,因为Public没有建表权限,除非为Public grant建表权限。所以,存储过程的调用者会面临两个问题:

  存储过程的名称解析环境
        存储过程的执行权限  
这两个问题可以在定义存储过程时,通过指定AUTHID 属性,即定义DR Procedure 和IR Procedure来解决。
DR Procedure

1、定 义
    CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID DEFINER as
      ...

    BEGIN

      ...

    END DEMO;
2、名称解析环境为定义该存储过程的用户所在的Schema。
3、执行该存储过程时只有Public权限。

IR Procedure
1、定 义

    CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID CURRENT_USER as
     ...
    BEGIN
     ...

    END DEMO;
2、名称解析环境为调用该存储过程的用户所在的Schema。
3、执行该存储过程时拥有调用者的所有权限,即调用者的Role是有效的。
因此楼主的问题只需要使用IR Procedure就能解决

create procedure   xxx AUTHID CURRENT_USER
as
begin
    INSERT INTO  TABLE1 SELECT * FROM USER_B.TABLE1;   
    EXECUTE IMMEDIATE   ' INSERT INTO  TABLE1 SELECT * FROM USER_B.TABLE1';
end;

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
8#
发表于 2012-2-27 01:26 | 只看该作者
qingyun是老江湖碰到老问题了

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
9#
发表于 2012-2-27 09:16 | 只看该作者
敏而好学,不耻下问,是以谓之'青云'也

使用道具 举报

回复
论坛徽章:
26
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24夏利
日期:2013-08-13 23:25:29优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11蓝色妖姬
日期:2015-03-19 09:37:00ITPUB年度最佳技术原创精华奖
日期:2015-03-19 09:43:24
10#
 楼主| 发表于 2012-2-27 12:27 | 只看该作者
呵呵,一直没怎么研究过权限,公司自己的项目,都是赋予了TOAD里大概263个权限全部勾选上;所以什么权限都有;
安全性很重要;不过为了省事,更多的是关注方便性;
oracle基础知识都是见缝插针的去学习;做项目也一直没有时间去系统学习;关注的最多的还是SQL,存储过程上的使用技巧;
毕竟大部分精力还是做前段开发

没想到已经被认为老江湖了,呵呵,惭愧惭愧。


使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表