Error: ORA-04062: timestamp of procedure has been changed

环境:rhel5.3 oracle 11.2.0.1.0

现象:

数据库1(db1)上过程p1通过dblink调用数据库2(db2)上的过程p2

当db2上p2中的内容改变后,重新编译后,再重新编译db1上的p1是没问题的,但运行p1时就回报错:  --注意是运行时报错

Error: ORA-04062: timestamp of procedure   has been changed

经过查询一些资料,得知是REMOTE_DEPENDENCIES_MODE = { TIMESTAMP | SIGNATURE } 导致的


11.2oracle文档解释:

REMOTE_DEPENDENCIES_MODEProperty Description 
Parameter type String 
Syntax REMOTE_DEPENDENCIES_MODE = { TIMESTAMP | SIGNATURE } 
Default value TIMESTAMP 
Modifiable ALTER SESSION, ALTER SYSTEM 

REMOTE_DEPENDENCIES_MODE specifies how Oracle should handle dependencies upon remote PL/SQL stored procedures.

Values:

•TIMESTAMP
The client running the procedure compares the timestamp recorded on the server-side procedure with the current timestamp of the local procedure and executes the procedure only if the timestamps match.

•SIGNATURE
Oracle allows the procedure to execute as long as the signatures are considered safe. This setting allows client PL/SQL applications to be run without recompilation.


以上的timestamp 是等价于dba_objests里面的timestamp 列值,测试:

SQL> create procedure p
as
begin
  null;
end;
/
Procedure created.
--注意:11.2.0.1.0的环境,创建完过程后,再次使用pl/sql developer查看时oracle直接给你增加了 or replace 变成:
create or replace procedure p as
begin
null;
end;

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.

SQL>  select last_ddl_time, timestamp from user_objects where object_name = 'P';

LAST_DDL_TIME    TIMESTAMP
------------------- -------------------
2013-07-28 14:12:12 2013-07-28:14:12:12

SQL> grant execute on P to public;
Grant succeeded.

SQL>  select last_ddl_time, timestamp from user_objects where object_name = 'P';

LAST_DDL_TIME    TIMESTAMP
------------------- -------------------
2013-07-28 14:28:45 2013-07-28:14:12:12

SQL> alter procedure P compile;
Procedure altered.

SQL> select last_ddl_time, timestamp from user_objects where object_name = 'P';

LAST_DDL_TIME    TIMESTAMP
------------------- -------------------
2013-07-28 14:33:48 2013-07-28:14:12:12

--这里使用pl/sql developer工具编译后,下面timestamp马上发生了变化,所以可以得出pl/sql developer工具编译时和sqlplus原理不一样

SQL> select last_ddl_time, timestamp from user_objects where object_name = 'P';

LAST_DDL_TIME    TIMESTAMP
------------------- -------------------
2013-07-28 14:35:05 2013-07-28:14:35:05

SQL> alter procedure P compile;
Procedure altered.

SQL> select last_ddl_time, timestamp from user_objects where object_name = 'P';


LAST_DDL_TIME    TIMESTAMP
------------------- -------------------
2013-07-28 14:36:26 2013-07-28:14:35:50

SQL> alter procedure P compile;
Procedure altered.

SQL> select last_ddl_time, timestamp from user_objects where object_name = 'P';

LAST_DDL_TIME    TIMESTAMP
------------------- -------------------
2013-07-28 14:36:41 2013-07-28:14:35:50


以上测试说明:

all_objects中的last_ddl_time包括了grant,同时也包括了revoke ;create procedure会直接变成 create or replace procedure ,使用pl/sql developer

会改变timestamp 值,但sqlplus 不会;如果过程的内容改变了,不管使用哪个工具timestamp都会改变


所以解决以上错误只有以下2种方式:

1:alter procedure xxx   compile;   --运行过程前提前把含有dblink过程编译一下

        2:alter session set remote_dependencies_mode=signature;


在p1的过程中在引用dblink过程之前增加:

EXECUTE IMMEDIATE 'alter session set remote_dependencies_mode=signature';


即可解决问题。


signature 基本意味着程序接口(过程名,参数类型或者模式),关于具体什么情况会改变signature,现在还不清楚,有资料说:

改变in/out 参数,或者表结构会导致signature改变!!,现在还没遇见,后续如遇signature报错问题会继续一一补充在下面!!



ERROR: ORA-01031: insufficient privileges是Oracle数据库中常见的错误之一,表示当前用户缺少执行特定操作所需的权限。该错误可能出现在多种情况下,例如在尝试连接数据库、执行特定SQL语句或访问特定对象时。 解决这个错误的方法有多种途径,下面我将介绍其中几种常用的方法: 1. 检查用户权限:首先,您需要检查当前用户是否具有执行所需操作的权限。您可以通过查询数据库字典视图如DBA_SYS_PRIVS、DBA_ROLE_PRIVS和DBA_TAB_PRIVS来查看用户的权限信息。如果缺少必要的权限,您可以使用GRANT语句向用户授予相应的权限。 2. 使用SYSDBA权限登录:如果您是以普通用户身份登录并遇到此错误,可以尝试使用SYSDBA权限登录。您可以在命令行中使用sqlplus / as sysdba命令以管理员身份登录Oracle数据库。这将以超级用户SYS的身份登录,该用户具有最高权限。在此登录之后,您可以尝试执行之前遇到错误的操作。 3. 检查连接字符串和监听器配置:如果您在连接数据库时遇到此错误,可以检查连接字符串和监听器配置。确保您使用的连接字符串正确,并且监听器配置中的服务名或SID正确。 4. 检查数据库角色和权限:如果您在执行特定SQL语句时遇到此错误,可能是由于当前用户缺少执行该语句所需的角色或权限。您可以通过查询数据库字典视图如DBA_ROLES和DBA_TAB_PRIVS_RECD来查看用户的角色和权限信息。如果缺少必要的角色或权限,您可以使用GRANT语句向用户授予相应的角色或权限。 需要注意的是,解决此错误的具体方法取决于具体的情况和操作,上述方法只是一些常见的解决途径。当遇到ERROR: ORA-01031: insufficient privileges错误时,您可以根据具体的情况进行适当的调整和处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值