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

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

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

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

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

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

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

如上所示,关于存储过程的系统权限一般有六种: 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> 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权限给某个用户,就可以实现只授予用户查看存储过程定义的权限,而限制用户修改、执行存储过程。从而达到只授权用户查看存储过程定义的权限。不过这样实现,总让我感觉有点怪怪的。

以上就是小编为大家整理的如何实现只授予用户查看存储过程定义的权限,希望可以对大家的学习能有所帮助。

(0)

相关推荐

  • oracle用户权限、角色管理详解

    Oracle 权限设置 一.权限分类: 系统权限:系统规定用户使用数据库的权限.(系统权限是对用户而言). 实体权限:某种权限用户对其它用户的表或视图的存取权限.(是针对表或视图而言的). 二.系统权限管理: 1.系统权限分类: DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构. RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构. CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构.

  • Oracle 用户权限管理方法

    sys;//系统管理员,拥有最高权限 system;//本地管理员,次高权限 scott;//普通用户,密码默认为tiger,默认未解锁 sys;//系统管理员,拥有最高权限 system;//本地管理员,次高权限 scott;//普通用户,密码默认为tiger,默认未解锁 二.登陆 sqlplus / as sysdba;//登陆sys帐户 sqlplus sys as sysdba;//同上 sqlplus scott/tiger;//登陆普通用户scott sqlplus / as sys

  • oracle用户权限管理使用详解

    一.系统的默认用户 1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户默认的密码是sys.登录语句:SQL> conn sys/sys as sysdba; 2)system用户是管理操作员,权限也很大.具有sysoper角色,没有create database的权限,默认的密码是manager.登录语句:SQL> conn system/manager; 3)sys和system这两个用户最大的区别是在于有没有create datab

  • Oracle删除当前用户下所有表的方法适用于有或没有删除权限

    1.如果有plsql客户端,则可以使用该用户登录,选中所有表 右键Drop即可. 2.如果有删除用户的权限,则可以: drop user user_name cascade; 加了cascade就可以把用户连带的数据全部删掉. 删除后再创建该用户. --创建用户 create user 用户名 profile default identified by 密码 default tablespace 表空间名称 temporary tablespace TEMP account unlock; --

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

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

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

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

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

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

  • Python 查看文件的读写权限方法

    实例如下: # -*- coding: utf-8 -*- # @author flynetcn import sys, os, pwd, stat, datetime; LOG_FILE = '/var/log/checkDirPermission.log'; nginxWritableDirs = [ '/var/log/nginx', '/usr/local/www/var', ]; otherReadableDirs = [ '/var/log/nginx', '/usr/local/w

  • “SQL2000数据库”运行在普通用户下所需的权限

    因此,从安全的角度考虑,我们要求所有用户将"SQL2000数据库"安装在独立的分区里面,而且,"SQL2000数据库"必须运行在"普通用户"的状态下.所谓"普通用户"就是指没有任何权限的用户. 为什么要将"SQL2000数据库"必须运行在"普通用户"的状态下呢?因为如果使用了"超级管理员"或者"本地系统用户"来运行"SQL2000数据库&

  • Android判断用户是否允许了摄像头权限实例代码

    如题,既然是判断用户是否允许了摄像头权限,那么,咱们就忽略是Manifest配置的问题,因为这是开发者的事. 用户在使用APP时,如果首次进入用摄像头的地方,手机会提示是否允许该应用使用摄像头.有些用户小手一抖.或者压根就不想开启摄像头,咔擦,就给你关了,那好了.下回再进入该功能,就会出现APP一片黑,或者崩溃的情况. 作为开发者,正常思路是要提示用户,摄像头权限被你关了,赶紧去手动开启,不然,就别想用该功能了!那,咱们该怎么实现这个思路呢? 一.判断摄像头权限 Android API没提供判断

  • 使SQL用户只能看到自己拥有权限的库(图文教程)

    以SQL Server 2012 为例 上图是部分数据库的截图, 我们执行 复制代码 代码如下: DENY VIEW any DATABASE to PUBLIC; 然后给Best库的Best用户执行 复制代码 代码如下: ALTER AUTHORIZATION ON DATABASE::Best TO Best 资源管理器中Best用户登陆后就只能显示Best库了, 同样给Mine库的Mine用户执行相同SQL 复制代码 代码如下: ALTER AUTHORIZATION ON DATABAS

  • Window XP用户安装科讯关于权限问题必看教程

    如果,您现在正使用xp系统,测试科汛CMS,请按下图示例设置权限. 此主题相关图片如下: 此主题相关图片如下: 将上图中的"使用简单文件共享"勾去掉 此主题相关图片如下: 右键科汛系统的目录,选择"属性" 此主题相关图片如下: 在弹出的对话框中,选择"安全"选项卡 此主题相关图片如下: 添加"everyone"用户 此主题相关图片如下: 此主题相关图片如下: 此主题相关图片如下: 注意,"everyone"

  • SQL Server中查看对象定义的SQL语句

    除了在SSMS中查看view,存储过程等定义,也可以使用下面的语句直接查询: 复制代码 代码如下: SELECT object_definition(object_id('sys.tables')); go sp_helptext 'sys.tables' go select * from sys.system_sql_modules whereobject_id = object_id('sys.tables') 适用于以下对象类型: ·        C = 检查约束 ·        D

  • Python判断某个用户对某个文件的权限

    在Python我们要判断一个文件对当前用户有没有读.写.执行权限,我们通常可以使用os.access函数来实现,比如: # 判断读权限 os.access(<my file>, os.R_OK) # 判断写权限 os.access(<my file>, os.W_OK) # 判断执行权限 os.access(<my file>, os.X_OK) # 判断读.写.执行权限 os.access(<my file>, os.R_OK | os.W_OK | os

随机推荐