最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

关于procedure中调用dbms_lock的package

[复制链接]
楼主
发表于 2014-8-20 10:06:14 | 显示全部楼层
本帖最后由 dbdream 于 2014-8-20 10:10 编辑

这是权限问题,dbms_lock包默认普通用户是没权限调用的,而dbms_stats这个包也不是普通用户什么都能调用的,之所以普通用户可以调用这个包,是因为这个包不但可以收集数据库级别的统计信息,还可以收集用户和表级别的,那么用户收集自己的统计信息也就是理所当然的了。
看下面的测试
SQL> conn / as sysdba
Connected.
SQL> drop user dbdream cascade;

User dropped.
SQL> grant connect,resource to dbdream identified by dbdream;

Grant succeeded.

SQL> conn dbdream/dbdream
Connected.
SQL> desc dbms_lock
ERROR:
ORA-04043: object "SYS"."DBMS_LOCK" does not exist
desc描述dbms_stats就可以,日志太多这就不贴了,这个普通用户使用这个包收集用户级的统计信息是可以的,收集数据库级就没权限了。
SQL> exec dbms_stats.gather_database_stats();
BEGIN dbms_stats.gather_database_stats(); END;

*
ERROR at line 1:
ORA-20000: Insufficient privileges to analyze an object in Database
ORA-06512: at "SYS.DBMS_STATS", line 13197
ORA-06512: at "SYS.DBMS_STATS", line 13556
ORA-06512: at "SYS.DBMS_STATS", line 13700
ORA-06512: at "SYS.DBMS_STATS", line 13664
ORA-06512: at line 1
其他用户也是可以的,因为是对dbms_STATS.GATHER_SCHEMA_STATS有权限,但是表级的统计信息,就只能收集自己的,别人的表他没权限。
SQL>  exec dbms_stats.gather_table_stats('DBDREAM','T_TEST');

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats('STREAM','T_TEST');
BEGIN dbms_stats.gather_table_stats('STREAM','T_TEST'); END;

*
ERROR at line 1:
ORA-20000: Unable to analyze TABLE "STREAM"."T_TEST", insufficient privileges
or does not exist
ORA-06512: at "SYS.DBMS_STATS", line 13046
ORA-06512: at "SYS.DBMS_STATS", line 13076
ORA-06512: at line 1
也就是说,如果想用普通用户去收集其他用户下面的表的统计信息,使用schema级的是可以的。
我只是简要测试下,具体细节大家可以自己测试下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-15 03:42

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表