oracle authid current_user详解1

2024-06-23 14:18

本文主要是介绍oracle authid current_user详解1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1      以当前用户的权限执行详解


在编写PLSQL程序时,对于授权的考虑很重要。Oracle PLSQL中提供两种授权选择:

说白了 :AUTHID DEFINER 就是当时登陆的用户写的。

--AUTHID DEFINER (定义者权限):指编译存储对象的所有者。也是默认权限模式。

--AUTHID CURRENT_USER(调用者权限):指拥有当前会话权限的模式,这可能和当前登录用户相同或不同(alter session set current_schema 可以改变调用者Schema)

来看下官方的解释:

By default, stored procedures and SQL methods execute with the privileges of their owner, not their current user. Suchdefiner's rights subprograms are bound to the schema in which they reside, allowing you to refer to objects in the same schema without qualifying their names. For example, if schemas HR and OEboth have a table called departments, a procedure owned by HR can refer to departments rather than HR.departments. If user OE calls HR's procedure, the procedure still accesses the departments table owned by HR.

A more maintainable way is to use the AUTHID clause, which makes stored procedures and SQL methods execute with the privileges and schema context of the calling user. You can create one instance of the procedure, and many users can call it to access their own data.

默认情况,程序以其拥有者身份(定义者)执行。定义者权限的程序与其所在模式绑定,调用对象不需要加上模式完整名称。例如,假如模式HR和OE都有deparments表,HR拥有的程序可直接调用departments而不用HR.departments.而如果OE调用HR的程序,程序仍然调用的是HR的departments.

如果希望不同模式(schema)调用相同的程序却可以操作各自拥有的对象,就可以在定义程序的时候加上AUTHID CURRENT_USER。

ORACLE用户具有DBA权限,却会出现无法在存储过程里面创建一张普通表的现象。因为即使用户拥有DBA权限,用户拥有的role权限在存储过程是不可用的。

遇到这种情况,通常解决方法是进行显式的权限分配: grant create table to user a;
但这种方法太麻烦,因为有可能执行一个存储过程,需要很多不同权限。
实际上,oracle给我们提供了在存储过程中使用role权限的方法:修改存储过程,加入Authid Current_User进行权限分配。

在ORACLE8i以前的版本,所有已编译存储对象,包括packages, procedures, functions, triggers, views等,只能以定义者(Definer)身份解析运行;
而ORACLE8i及其后的新版本,Oracle引入调用者(invoker)权限,使得对象可以以调用者身份和权限执行。

目前ORACLE存储过程默认都是使用定义者权限调用,以定义者身份执行;而声明Authid Current_User后则就是调用者权限,以调用者身份执行。

定义者权限:如果在user a下创建的procedure,那其他user只要能执行procedure,这个procedure所做的内容都是以user a的名义来执行的。因为user a是procedure的定义者。user a能做什么,那这个procedure就能做什么。
调用者权限:如果在user a下创建的procedure,那其他user只要能执行procedure,这个procedure所做的内容都是以当前user的名义来做的。如果某个table只有user a有权限建,那这个procedure在user a下面才执行成功。其他user下是不成功的。

而Authid Current_User即是以拥有当前会话权限、以执行过程的用户的权限来处理涉及的对象权限。

在Oracle的存储过程中,如果涉及到操作不同schema下的对象的时候,可以在不同的schema下写相同的procedure,但这样带來的问题是维护和同步麻烦,
在procedure中加上authid current_user,来说明procedure中操作的对象是当前连接用户的对象而并不是procedure所属用户下的对象。

但如果该过程的调用者(而非定义者)被授与系统权限execute any procedure  或是被该过程的定义者grant execute on授权的话,不用authid current_user子句,调用者照样可以使用这个过程。

下面举例说明2中授权机制:

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

?
1
C:\Users\Administrator>sqlplus sys/oracle @orcl as sysdba
查看一下sys模式下user_tables表记录数:
?
1
2
3
4
5
sys @ORCL > select count(*) from user_tables;
   COUNT(*)
----------
        972
创建2个对比函数:

get_count is default auth mode. When another user calls this function it will use SYS's user_tables

?
1
2
3
4
5
6
7
8
9
10
sys @ORCL > CREATE OR REPLACE FUNCTION get_count RETURN NUMBER AUTHID DEFINER IS
   2      table_count NUMBER;
   3    BEGIN
   4      SELECT COUNT(*) INTO table_count FROM user_tables;
   5
   6      RETURN table_count;
   7    END;
   8    /
函数已创建。

get_count2 is CURRENT_USER auth mode. When another user calls this function it will use its user_tables

?
1
2
3
4
5
6
7
8
9
10
11
sys @ORCL >  CREATE OR REPLACE FUNCTION get_count2 RETURN NUMBER AUTHID CURRE
NT_USER IS
   2      table_count NUMBER;
   3    BEGIN
   4      SELECT COUNT(*) INTO table_count FROM user_tables;
   5
   6      RETURN table_count;
   7    END;
   8    /
函数已创建。

下面进行授权操作:

?
1
2
3
4
5
6
7
sys @ORCL > grant execute on get_count to hr;
授权成功。
sys @ORCL > grant execute on get_count2 to hr;
授权成功。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
sys @ORCL > conn hr/hr;
已连接。
hr @ORCL > SELECT sys.get_count FROM dual;
  GET_COUNT
----------
        972
hr @ORCL > SELECT sys.get_count2 FROM dual;
GET_COUNT2
----------
          7

结果一目了然。

定义者权限模式确保我们能控制对集中式DML操作。
而调用者权限模式则确保我们能控制对分布式数据的DML操作。


这篇关于oracle authid current_user详解1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087389

相关文章

Mysql数据库聚簇索引与非聚簇索引举例详解

《Mysql数据库聚簇索引与非聚簇索引举例详解》在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,:本文主要介绍Mysql数据库聚簇索引与非... 目录前言一、核心概念与本质区别二、聚簇索引(Clustered Index)1. 实现原理(以 Inno

sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

《sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符》:本文主要介绍sqlserver、mysql、oracle、pgsql、sqlite五大... 目录一、转义符1.1 oracle1.2 sqlserver1.3 PostgreSQL1.4 SQLi

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1