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

简介:

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

关于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> 

clip_image001

将存储过程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权限给某个用户,就可以实现只授予用户查看存储过程定义的权限,而限制用户修改、执行存储过程。从而达到只授权用户查看存储过程定义的权限。不过这样实现,总让我感觉有点怪怪的。

相关文章
|
1月前
|
存储 SQL 数据库
存储过程定义
存储过程是一组为了完成特定功能的SQL语句集合。 存储过程在使用过程中是将常用或者复杂的工作,预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统SQL速度更快、执行效率更高。
|
4月前
|
人工智能 开发者 前端开发
【创新·未来】当AI遇见代码:Vaadin Copilot引领Web开发新时代,你准备好了吗?
【8月更文挑战第31天】Vaadin 是一个成熟的 Java Web 应用框架,最新版本 24.4.0 带来了多项更新,包括引入 Vaadin Copilot——一个集成 AI 的开发工具,可实现拖放组件、实时更新源代码等功能。此外,Vaadin 24.4.0 还统一了 Hilla 框架,支持 Flow 和 Hilla 视图混合应用,实现 React 组件与 Java 应用的无缝集成。未来,Vaadin 将继续提升开发者体验和应用性能,整合更多现代 Web 技术,如 Web 组件和 PWA 支持,保持其在企业级应用开发领域的领先地位。
63 0
|
4月前
|
存储 SQL 测试技术
Entity Framework Core 中的存储过程超厉害!从定义到调用全攻略,提升性能与安全性!
【8月更文挑战第31天】在现代软件开发中,数据库操作效率至关重要。Entity Framework Core(EF Core)作为强大的对象关系映射(ORM)框架,支持存储过程,可提升数据库操作的性能、安全性和可维护性。本文详细介绍如何在 EF Core 中定义、配置及调用存储过程,并提供最佳实践建议,包括性能优化、安全性增强、代码可维护性提升以及参数化查询等。通过遵循这些指导原则,开发者能够充分利用存储过程的优势,显著提高应用程序质量和性能。附带完整示例代码,展示从定义实体类到调用存储过程的全过程。
254 0
|
6月前
|
存储 SQL 关系型数据库
MySQL数据库——存储过程-变量(系统变量、用户定义变量、局部变量)
MySQL数据库——存储过程-变量(系统变量、用户定义变量、局部变量)
434 0
|
7月前
|
存储 SQL 定位技术
数据库基础(六):T-SQL语言程序设计、游标定义与使用及存储过程创建与信息查找
数据库基础(六):T-SQL语言程序设计、游标定义与使用及存储过程创建与信息查找
109 1
|
存储 MySQL 关系型数据库
mysql 跑存储过程没有权限的问题
mysql 跑存储过程没有权限的问题1.赋予权限GRANT ALL PRIVILEGES ON . TO root@"%" IDENTIFIED BY "root";2.刷新权限FLUSH PRIVILEGES;
1316 0
|
存储 关系型数据库 MySQL
MYSQL修改存储过程的访问权限
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.
1266 0