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

有个网友问我,如何授予某个用户只能查看某些存储过程的定义权限,而不能让用户去修改、执行存储过程。看似简单的问题,却因为从没有碰到这样的需求。花了点时间才梳理、总结清楚。

关于ORACLE账号的权限问题,一般分为两种权限:

系统权限: 允许用户执行特定的数据库动作,如创建表、创建索引、创建存储过程等

对象权限: 允许用户操纵一些特定的对象,如读取视图,可更新某些列、执行存储过程等

像这种查看存储过程定义的权限为对象权限,但是我们还是首先来看看关于存储过程的系统权限吧:

SQL> SELECT * FROM SYSTEM_PRIVILEGE_MAP WHERE NAME LIKE ‘%PROCEDURE%‘;
 

 PRIVILEGE NAME                                       PROPERTY

---------- ---------------------------------------- ----------

      -140 CREATE PROCEDURE                                  0

      -141 CREATE ANY PROCEDURE                              0

      -142 ALTER ANY PROCEDURE                               0

      -143 DROP ANY PROCEDURE                                0

      -144 EXECUTE ANY PROCEDURE                             0

      -241 DEBUG ANY PROCEDURE                               0

 

6 rows selected.

如上所示,关于存储过程的系统权限一般有六种: CREATE PROCEDURE、CREATE ANY PROCEDURE、 ALTER ANY PROCEDURE、DROP ANY PROCEDURE、 EXECUTE ANY PROCEDURE、DEBUG ANY PROCEDURE. 那么关于存储过程的对象权限又有那些呢? 如下例子所示,在用户ESCMUSER下创建存储过程PROC_TEST

CREATE OR REPLACE PROCEDURE ESCMUSER.PROC_TEST
AS

BEGIN 

  DBMS_OUTPUT.PUT_LINE(‘It is only test‘);

END;

使用system用户创建用户TEMP,如下所示

SQL> create user temp identified by temp;
 

User created.

 

SQL> grant connect,resource to temp;

 

Grant succeeded.

在用户ESCMUSER下将存储过程PROC_TEST的所有权限授予给用户TEMP。 那么我们发现存储过程的对象权限只有EXECUTE、DEBUG权限

SQL> GRANT ALL ON PROC_TEST TO TEMP;

 
SQL> COL GRANTEE FOR A12;

SQL> COL TABLE_NAME FOR A30;

SQL> COL GRANTOR FOR A12;

SQL> COL PRIVILEGE FOR A8;

SQL> SELECT * FROM USER_TAB_PRIVS_MADE WHERE GRANTEE=‘TEMP‘;

 

GRANTEE      TABLE_NAME              GRANTOR      PRIVILEGE               GRA HIE

---------- --------------------- ------------ --------------------------- --- ---

TEMP         PROC_TEST                ESCMUSER     DEBUG                   NO  NO

TEMP         PROC_TEST                ESCMUSER     EXECUTE                 NO  NO

 

SQL> 

将存储过程PORC_TEST的权限从TEMP用户收回,然后授予用户TEMP关于存储过程PROC_TEST的DEBUG权限

SQL>REVOKE ALL ON PROC_TEST FROM TEMP;
 

SQL>GRANT DEBUG ON PROC_TEST TO TEMP;

那么TEMP用户此时执行存储过程报权限不足

SQL> SET SERVEROUT ON;
SQL> EXEC escmuser.proc_test;

 

begin escmuser.proc_test; end;

 

ORA-06550: line 2, column 16:

PLS-00904: insufficient privilege to access object ESCMUSER.PROC_TEST

ORA-06550: line 2, column 7:

PL/SQL: Statement ignored

此时,如果修改存储过程PROC_TEST就会ORA-01031权限不足问题。但是你可以在PL/SQL Developer工具或使用下面视图查看存储过程的定义。如下所示。

SELECT * FROM ALL_SOURCE WHERE NAME=‘PROC_TEST‘

所以,只需要授予存储过程的DEBUG权限给某个用户,就可以实现只授予用户查看存储过程定义的权限,而限制用户修改、执行存储过程。从而达到只授权用户查看存储过程定义的权限。不过这样实现,总让我感觉有点怪怪的。

时间: 2024-10-09 05:59:49

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

SQL Server中授予用户查看对象定义的权限

  在SQL Server中,有时候需要给一些登录名(用户)授予查看所有或部分对象(存储过程.函数.视图.表)的定义权限存.如果是部分存储过程.函数.视图授予查看定义的权限,那么就像下面脚本所示,比较繁琐: GRANT VIEW DEFINITION ON  YOUR_PROCEDURE TO   USERNAME; GRANT VIEW DEFINITION ON  YOUR_FUNCTION TO USERNAME; GRANT VIEW DEFINITION ON  YOUR_VIEW T

sqlserver授予用户查看执行计划的权限

sqlserver查看语句的执行计划是非常重要的,可以提高开发人员代码的质量.所以有必要授予开发人员对数据库查看执行计划的权限. 查看执行计划的权限属于数据库一级别的权限,具体例子如下 use test:--选择需要授权的数据库 grant showplan to user;--授权给对应的用户

Chapter 2 User Authentication, Authorization, and Security(9):防止登录名和用户查看元数据

原文出处:http://blog.csdn.net/dba_huangzj/article/details/39003679.专题文件夹:http://blog.csdn.net/dba_huangzj/article/details/37906349 未经作者同意.不论什么人不得以"原创"形式公布,也不得已用于商业用途.本人不负责不论什么法律责任. 前一篇:http://blog.csdn.net/dba_huangzj/article/details/38944121 前言: 在S

Oracle 存储过程定义和优点及与函数区别

定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可.在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包. 优 点: 1.(预编译)存储过程只在创造

如何查看存储过程中动态生成的sql

今天在工作中遇到那么一个需求,要查看存储过程中生成的sql,以便和实际的业务需求核对. 经过多方查询,想到如下办法: 1.在存储过程中凡是涉及到execute immediate mysql的地方,加上DBMS_OUTPUT.PUT_LINE(mysql);同时为了减少运行时间将execute immediate mysql注释. 2.如果因为mysql字符过长,报string buffer is too small,那么采用另外一种方式,事先定义v_pos Number := 1;然后通过以下

MySQL存储过程定义中的特性(characteristic)的含义

MySQL的存储过程蛮啰嗦的,与MSSQL或者Oracle的存储过程相比,如果没有显式指定,他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程 通常在使用图形界面工具进行存储过程编写的时候,图形界面工具会自动加上这部分内容比如用HeidiSQL创建存储过程的时候,会自动生成这些特性(characteristic)的默认值.但是这些特性究竟是干啥的,有什么影响,一直没有怎么弄清楚. LANGUAGE SQL存储过程语言,默认是sql,说明存储过程中使用的是sql语言编写

ORA-0131:Insufficient privileges(Oracle授予用户DEBUG权限)

错误提示: 原因:调试过程(存储过程)没有系统权限 解决方法:以SYS管理员身份登陆,并授予用户DEBUG CONNECT SESSION权限 GRANT DEBUG CONNECT SESSION TO SCOTT 查看数据字典role_sys_privs表该权限的相关信息 select * from roie_sys_privs where privilege like 'DEBUG%' order by 2; 原文地址:https://www.cnblogs.com/heibaijianp

SQLServer查看存储过程的方法

使用 sp_helptext 查看存储过程的定义 在对象资源管理器中,连接到 数据库引擎实例,再展开该实例. 在工具栏上,单击“新建查询”. 在查询窗口中,输入下列语句.更改数据库名称和存储过程名称以引用所需的数据库和存储过程. USE ycamc;GOEXEC sp_helptext 'ps_RoleListMenuArea';

好产品,只帮用户做好一件事

我想用一句话作为本章的开场“产品道,非常道!”这六个字需要我们慢慢体会. 作为一个产品人,在当今这个社会可真是不好当,他需要你具备的条件是很多,这些条件中最重要的一条大家都知道,找到适合自己的一件事情,然后用心坚持做下去,然后呢,用时间来证明这件事情的价值,只有这件事情有了价值,产品人才有了价值. 在现在这个社会,找件事情做是很容易的,但是找个好事情不容易,自己能发明一个嘛?很难.或者跟别人做一下,也很费劲.整个一堆事情就出来了,你会发现到头来这所有的所有都非常的难. 我有一个毛病,经常会忘记一