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

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

关于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-09-20 13:47:36

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

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

有个网友问我,如何授予某个用户只能查看某些存储过程的定义权限,而不能让用户去修改.执行存储过程.看似简单的问题,却因为从没有碰到这样的需求.花了点时间才梳理.总结清楚. 关于ORACLE账号的权限问题,一般分为两种权限: 系统权限: 允许用户执行特定的数据库动作,如创建表.创建索引.创建存储过程等 对象权限: 允许用户操纵一些特定的对象,如读取视图,可更新某些列.执行存储过程等 像这种查看存储过程定义的权限为对象权限,但是我们还是首先来看看关于存储过程的系统权限吧: PRIVILEGE NAME

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

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

SQL Server联机丛书:查看存储过程

server|存储过程 几个系统存储过程用系统表提供有关存储过程的信息.使用这些存储过程可以: 查看用于创建存储过程的 Transact-SQL 语句.这对于没有用于创建存储过程的 Transact-SQL 脚本文件的用户是很有用的. 获得有关存储过程的信息(如存储过程的所有者.创建时间及其参数).列出指定存储过程所使用的对象及使用指定存储过程的过程.此信息可用来识别那些受数据库中某个对象的更改或删除影响的过程. 查看存储过程的定义sp_helptext显示规则.默认值.未加密的存储过程.用户定

MySQL用户执行存储过程的权限

  MySQL中以用户执行存储过程的权限为EXECUTE 比如我们在名为configdb的数据库下创建了如下存储过程,存储过程的定义者为user_admin use configdb; drop procedure if exists sp_dev_test_user_add; delimiter $$ CREATE DEFINER=`user_admin`@`%` PROCEDURE `sp_dev_test_user_add`( in var_user varchar(30), in var

获取SqlServer存储过程定义的三种方法

存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快.同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量.简单网络负担. 存储过程的优点 A. 存储

获取SqlServer存储过程定义的三种方法_MsSql

存储过程的概念     存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行.     存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值.     由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快.同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量.简单网络负担. 存

plsql查看存储过程目录报错ora-03114 未连接到数据库(oracle11G)

问题描述 plsql查看存储过程目录报错ora-03114 未连接到数据库(oracle11G) 只要一点击左边的小箭头就报错,而且无法查看里面的内容,但是打开一个sql窗口却可以查询数据,并不是真的连接不上数据库,还请各位大神帮忙 解决方案 Ora-03114:未连接数据库 现象: 在使用pl/sql developer编译时总是报 Ora-03114:未连接数据库. 解决方法: 去掉cdc功能. 故障原因:PLSQLDev.exe程序和Oracle数据库的CDC功能产生冲突:使用TOAD,O

WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看_php实例

对搜索引擎隐藏特定的文章这个问题的来源是这样的: 众所周知,随着搜索引擎的改良,会越来越排斥采集和伪原创,尤其是百度还推出了起源算法,对采集站进行K站等措施.如果被贴上采集站的标签,所有的努力可能付诸东流. 相信很多站长,也想多一些原创内容,并不想全部靠采集别人的文章.然而一个新站,尤其是个人站长,其内容的充实速度一定很慢,我们做站不仅要讨好搜索引擎,更要讨好读者.如果读者不能在你的站内得到比较充实丰富的信息,那体验肯定不好.其实各大名站老站,一样有相当比例的采集或改编内容,这符合互联网的共享精

如何给用户控件定义属性(C#:ASP.NET)

asp.net|控件 前言 ASP.NET的用户控件功能很强大,在web窗体里面调用相信大家都会,如果要给用户控件定义属性,那该怎么做呢?只要你看完这篇文章保你会给自己的控件上弄上几个属性.本篇文章不太适合初学.NET的朋友,涉及到一些面向对象的知识,如果您不了解这些知识,请参阅相关书籍 在这里下载电子图书(http://www.cs-aspx.net/down.aspx) 程序namespace DotNet{ using System; using System.Data; using Sy