当前位置: 首页 > 科技观察

如何只授予用户查看存储过程定义的权限

时间:2023-03-19 16:38:13 科技观察

有网友问我如何只授予用户查看某些存储过程定义的权限,而不允许用户修改和执行存储过程。看似简单的问题,但是因为我从来没有遇到过这样的需求。花了一些时间整理总结清楚。关于ORACLE账户的权限,一般分为两种权限:系统权限:允许用户进行特定的数据库操作,如创建表、创建索引、创建存储过程等对象权限:允许用户操作一些具体的对象,比如读取Views,可以更新某些列,执行存储过程等。这样通过查看存储过程定义的权限是对象权限,但是我们先看一下存储过程的系统权限:PRIVILEGENAMEPROPERTY----------------------------------------------------------140CREATEPROCEDURE0-141CREATEANYPROCEDURE0-142ALTERANYPROCEDURE0-143DROPANYPROCEDURE0-144EXECUTEANYPROCEDURE0-241DEBUGANYPROCEDURE0如上所示,关于存储过程的系统权限一般有六种:CREATEPROCEDURE、CREATEANYPROCEDURE、ALTERANYPROCEDURE、DROPANYPROCEDURE、EXECUTEANY程序、调试任何程序。那么存储过程的对象权限呢?如下例所示,创建一个存储过程PROC_TESTCREATEORREPLACEPROCEDUREESCMUSER.PROC_TESTASBEGINDBMS_OUTPUT.PUT_LINE('Itisonlytest');END;;Usercreated.SQL>grantconnect,resourcetotemp;授予成功。将存储过程PROC_TEST的所有权限授予用户ESCMUSER下的用户TEMP。然后发现存储过程的对象权限只有EXECUTE,DEBUG权限SQL>COLGRANTEEFORA12;SQL>COLTABLE_NAMEFORA30;SQL>COLGRANTORFORA12;SQL>COLPRIVILEGEFORA8;SQL>SELECT*FROMUSER_TAB_PRIVS_MADEWHEREGRANTEE='TEMP';GRANTEETABLE_NAMEGRANTORPRIVILEGRAHIE--------------------------------------------------------------------------TEMPPROC_TESTESCMUSERDEBUGNONONOTEMPPROC_TESTESCMUSEREXECUTENONOSQL>从TEMP用户手中收回存储过程PORC_TEST的权限,然后授予用户TEMP存储过程PROC_TEST的DEBUG权限SQL>REVOKEALLONPROC_TESTFROMTEMP;SQL>GRANTDEBUGONPROC_TESTTOTEMP;ThenTEMP此时用户报权限不足,无法执行存储过程SQL>SETSERVEROUTON;SQL>EXECescmuser.proc_test;beginescmuser.proc_test;end;ORA-06550:line2,column16:PLS-00904:insufficientprivilegetoaccessobjectESCMUSER.PROC_TESTORA-06550:line2,column7:PL/SQL:Statementignored此时如果修改存储过程PROC_TEST,您的ORA-01031权限不足。但是您可以在PL/SQLDeveloper工具中或使用以下视图查看存储过程定义。如下。SELECT*FROMALL_SOURCEWHERENAME='PROC_TEST'因此,只需要将存储过程的DEBUG权限授予某个用户,就可以实现只授予该用户查看存储过程定义的权限,并且用户被限制修改和执行存储过程。从而实现只有授权用户才能查看存储过程定义的权限。但是,这个实现总让我觉得有些奇怪。原文链接:http://www.cnblogs.com/kerrycode/p/4580256.html