关于无法在Oracle 存储过程中动态创建database link的问题
下午遇到一个问题。
Oracle数据库下有一个用户test,授予了dba,resource等所有应该有的权限。该用户能在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应该是一种角色型的权限,它表示该角色下的用户可以干任何事情,但是“可以干”不代表直接就可以干,还需要再“申请”下?确实有点费解。
分享到:
相关推荐
本文将详细介绍如何在Oracle数据库中创建DATABASE LINK,并通过实际示例来演示整个过程。 #### 二、DATABASE LINK的作用与特点 - **作用**:DATABASE LINK允许用户跨数据库执行查询、插入、更新和删除操作。它支持...
### Oracle存储过程与Database ...通过以上介绍,我们了解了如何在Oracle中创建和调用带有输入/输出参数的存储过程,以及如何创建和使用Database Link来访问远程数据库。这些技术对于实现复杂的应用程序逻辑非常有用。
在存储过程中,关于出现 null 的问题也需要特殊处理。 Hibernate 调用 Oracle 存储过程 Hibernate 是一个流行的 ORM 框架,能够将 Java 对象与数据库表映射起来。Hibernate 调用 Oracle 存储过程时,需要使用 ...
3. **在存储过程中使用**:在存储过程中,可以直接查询、更新或删除这个临时表中的数据。 4. **结束会话**:会话结束后,临时表及其所有数据将自动消失。 ### 事务级临时表 事务级临时表(Transaction-Level ...
databaselink是oracle数据库连接另一个数据库(可以是非oracle数据库)用的连接
创建DBLINK时,创建者需要具有 `CREATE DATABASE LINK` 或 `CREATE PUBLIC DATABASE LINK` 权限,同时远程数据库的用户应有 `CREATE SESSION` 权限,这些权限通常包含在 `CONNECT` 角色中。 DBLINK可以不指定远程...
DBLink(Database Link)是一种允许在一个Oracle数据库实例中访问另一个Oracle数据库实例中的对象的技术。DBLink的应用场景非常广泛,例如在不同的数据库实例之间复制数据、合并多个数据库中的数据等。 #### 七、...
Oracle 创建 Database link 方法是指在 Oracle 中创建一个 Database link 的过程,这样可以实现跨库访问,即在一个数据库中可以访问另一个数据库中的数据。下面将详细介绍如何创建 Database link 以及通过 Database...
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存储过程脚本”指的是在PowerBuilder(简称PB)环境中调用Oracle数据库的存储过程。PowerBuilder是一种可视化的开发工具,常用于构建数据驱动的应用程序。Oracle存储过程则是在Oracle数据库...
oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel
本篇将深入探讨如何在Oracle存储过程中创建并返回一个结果集,并结合Java代码展示如何在应用程序中使用这个结果集。 首先,我们需要理解`OUT`参数的概念。在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`...
能不能写个动态的业务,只输入存储过程名称,自动获取存储过程参数,并且参数的数据从前台传递过来,这个就通用了。只写一个通用方法,就可以调用所有的存储过程。只根据输入不同的存储过程名称、参数内容,自动调用...
这篇博客“oracle存储过程-帮助文档”可能提供了关于如何创建、调用和管理Oracle存储过程的详细指导。下面我们将深入探讨存储过程的核心概念、用途、优势以及常见操作。 1. **什么是存储过程?** 存储过程是预...
在存储过程中,可以使用`EXECUTE IMMEDIATE`执行动态SQL,这在处理不确定的SQL语句或需要构建SQL语句时非常有用。 九、游标 存储过程可以使用游标(CURSOR)处理多行结果集。游标允许按行读取结果集,常用于循环...
同时,提供的数据库文件可能包含了创建存储过程的脚本,可以在Oracle数据库中执行这些脚本来创建对应的存储过程。 在实际项目中,可能还需要考虑事务管理、异常处理等细节,确保数据操作的完整性和一致性。例如,...
在存储过程中执行动态SQL,有两种主要方式: 1. **本地动态SQL**:适用于简单的动态查询构建。 2. **使用DBMS_SQL包**:提供了更强大的功能,如动态执行SQL语句和获取结果集。 #### 存储过程调用Java方法 Oracle ...
在将C#的List传递给Oracle存储过程时,我们需要创建一个PL/SQL类型的数组,以便存储过程能够理解和处理C#列表中的元素。 1. **创建Oracle存储过程**: 在Oracle数据库中,创建一个接受数组作为参数的存储过程。...