`
JohnnyCan
  • 浏览: 28621 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于无法在Oracle 存储过程中动态创建database link的问题

阅读更多

 

关于无法在Oracle 存储过程中动态创建database link的问题

 

下午遇到一个问题。

Oracle数据库下有一个用户test,授予了dbaresource等所有应该有的权限。该用户能在sqlplus pl/sql等命令行环境中,成功的创建db link,命令如下:

create database link dblink_name connect to user_name identified by user_pwd using 'db_remote' ;

 

当我将这个命令放在存储过程中,即动态的创建dblink的时候,问题来了。过程可以编译成功,运行的时候提示说没有权限(ORA-01031)。过程如下:

create or replace procedure proc_test_name as

begin

  execute immediate 'create database link dblink_name connect to user_name identified by user_pwd using ''db_remote''' ;

end;

但是我通过一个匿名过程的形式来执行这段命令是可以的,如下:

begin

execute immediate 'create database link qs_sync connect to qs identified by qs using ''qs_qx''';

end ;

/

经与同事讨论,问题基本定位,可能是不能在存储过程中动态创建dblink

疑惑的是:用户具有了dba权限(用户能在命令行下创建dblink更验证了这点),同时过程是用户的,为什么在过程中无法创建dblink?为什么在匿名过程中又可以?

有了方向于是开始google

 

找了几篇帖子,问题算是解决了,有两种方式:

1,在你的过程签名后临时声明授权:authid current_user 。代码如下:

create or replace procedure proc_test_name authid current_user

as

begin

  execute immediate 'create database link dblink_name connect to user_name identified by user_pwd using ''db_remote''' ;

end;

  

2,给你的用户再授权一次。grant create database link to user_name(永久的)。

 

对于以上的操作,Oracle也没有给出明确的解释,网上相关的资料也较少。与同事讨论了下可能的原因,可能是Oracle 权限管理的一个小bug吧。Oracle中的权限分系统权限和对象权限,dba应该是一种角色型的权限,它表示该角色下的用户可以干任何事情,但是“可以干”不代表直接就可以干,还需要再“申请”下?确实有点费解。

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    Oracle数据库如何创建DATABASE LINK

    本文将详细介绍如何在Oracle数据库中创建DATABASE LINK,并通过实际示例来演示整个过程。 #### 二、DATABASE LINK的作用与特点 - **作用**:DATABASE LINK允许用户跨数据库执行查询、插入、更新和删除操作。它支持...

    oracle 存储过程 databaselink 收集

    ### Oracle存储过程与Database ...通过以上介绍,我们了解了如何在Oracle中创建和调用带有输入/输出参数的存储过程,以及如何创建和使用Database Link来访问远程数据库。这些技术对于实现复杂的应用程序逻辑非常有用。

    oracle存储过程学习经典入门

    在存储过程中,关于出现 null 的问题也需要特殊处理。 Hibernate 调用 Oracle 存储过程 Hibernate 是一个流行的 ORM 框架,能够将 Java 对象与数据库表映射起来。Hibernate 调用 Oracle 存储过程时,需要使用 ...

    Oracle存储过程中使用临时表

    3. **在存储过程中使用**:在存储过程中,可以直接查询、更新或删除这个临时表中的数据。 4. **结束会话**:会话结束后,临时表及其所有数据将自动消失。 ### 事务级临时表 事务级临时表(Transaction-Level ...

    oracle中databaselink创建

    databaselink是oracle数据库连接另一个数据库(可以是非oracle数据库)用的连接

    Oracle DATABASE LINK(DBLINK)创建与删除方法

    创建DBLINK时,创建者需要具有 `CREATE DATABASE LINK` 或 `CREATE PUBLIC DATABASE LINK` 权限,同时远程数据库的用户应有 `CREATE SESSION` 权限,这些权限通常包含在 `CONNECT` 角色中。 DBLINK可以不指定远程...

    oracle 存储过程 函数 dblink

    DBLink(Database Link)是一种允许在一个Oracle数据库实例中访问另一个Oracle数据库实例中的对象的技术。DBLink的应用场景非常广泛,例如在不同的数据库实例之间复制数据、合并多个数据库中的数据等。 #### 七、...

    Oracle创建Database link方法

    Oracle 创建 Database link 方法是指在 Oracle 中创建一个 Database link 的过程,这样可以实现跨库访问,即在一个数据库中可以访问另一个数据库中的数据。下面将详细介绍如何创建 Database link 以及通过 Database...

    oracle存储过程,批量创建表和数据

    oracle存储过程,批量创建表和数据,表的个数支持参数传入

    Python使用cx_Oracle调用Oracle存储过程的方法示例

    首先,在数据库端创建简单的存储过程。 create or replace procedure test_msg(i_user in varchar2, o_msg out varchar2) is begin o_msg := i_user ||', Good Morning!'; end; 然后,开始在Python命令行中进行...

    pb中执行oracle存储过程脚本

    标题中的“pb中执行oracle存储过程脚本”指的是在PowerBuilder(简称PB)环境中调用Oracle数据库的存储过程。PowerBuilder是一种可视化的开发工具,常用于构建数据驱动的应用程序。Oracle存储过程则是在Oracle数据库...

    oracle 存储过程导出excel

    oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel

    Oracle存储过程返回结果集

    本篇将深入探讨如何在Oracle存储过程中创建并返回一个结果集,并结合Java代码展示如何在应用程序中使用这个结果集。 首先,我们需要理解`OUT`参数的概念。在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`...

    springboot mybatis 动态调用oracle存储过程,通过存储过程名称,就能动态调用存储过程、java动态调用or

    能不能写个动态的业务,只输入存储过程名称,自动获取存储过程参数,并且参数的数据从前台传递过来,这个就通用了。只写一个通用方法,就可以调用所有的存储过程。只根据输入不同的存储过程名称、参数内容,自动调用...

    oracle存储过程-帮助文档

    这篇博客“oracle存储过程-帮助文档”可能提供了关于如何创建、调用和管理Oracle存储过程的详细指导。下面我们将深入探讨存储过程的核心概念、用途、优势以及常见操作。 1. **什么是存储过程?** 存储过程是预...

    ORACLE存储过程最全教程

    在存储过程中,可以使用`EXECUTE IMMEDIATE`执行动态SQL,这在处理不确定的SQL语句或需要构建SQL语句时非常有用。 九、游标 存储过程可以使用游标(CURSOR)处理多行结果集。游标允许按行读取结果集,常用于循环...

    hibernate query调用oracle存储过程

    同时,提供的数据库文件可能包含了创建存储过程的脚本,可以在Oracle数据库中执行这些脚本来创建对应的存储过程。 在实际项目中,可能还需要考虑事务管理、异常处理等细节,确保数据操作的完整性和一致性。例如,...

    oracle存储过程学习经典

    在存储过程中执行动态SQL,有两种主要方式: 1. **本地动态SQL**:适用于简单的动态查询构建。 2. **使用DBMS_SQL包**:提供了更强大的功能,如动态执行SQL语句和获取结果集。 #### 存储过程调用Java方法 Oracle ...

    C# 传入自定义列表List 到Oracle存储过程

    在将C#的List传递给Oracle存储过程时,我们需要创建一个PL/SQL类型的数组,以便存储过程能够理解和处理C#列表中的元素。 1. **创建Oracle存储过程**: 在Oracle数据库中,创建一个接受数组作为参数的存储过程。...

Global site tag (gtag.js) - Google Analytics