首页 > 默认 > 无法调用 fnd_ldap_wrapper.update_user错误分析

无法调用 fnd_ldap_wrapper.update_user错误分析

2012年9月18日 admin 发表评论 阅读评论

 

版本: EBS R12.1.3   Vision

现象:

在更新EBS 用户时,报错:fnd_ldap_wrapper.update_user

image

分析:估计是系统启用了EBS跟LDAP集成的配置,导致更新用户时去更新LDAP目录了,但是什么配置文件呢?

打开这个package

image

查找fnd_profile , 找到两个profile :

profile:APPS_SSO_LDAP_SYNC

profile:APPS_SSO

查找这两个profile的定义:

image

进一步检查 “Oracle Applications SSO LDAP 同步”的Site层配置:

image

发现是“启用” ;

把 配置文件“Oracle Applications SSO LDAP 同步” 改成

image

发现改了以后,更改用户信息依然报错,错误现象跟原来一样,  没用;

 

 

查 数据库 log 

/d01/oracle/VIS/db/tech_st/11.1.0/admin/VIS_syfdemo/diag/rdbms/vis/VIS/trace/alert_VIS.log

发现有这么一条:

ORA-1653: unable to extend table APPLSYS.FND_FORM_FUNCTIONS_TL by 16 in                 tablespace APPS_TS_SEED

考虑到创建用户也属于基础数据,于是把 APPS_TS_SEED 表空间下面的一个datafile 从600M 扩大到800M

alter database datafile '/d01/oracle/VIS/db/apps_st/data/reference1.dbf' resize 800M

再次尝试修改用户信息,错误依旧;

 

 

打开日志调试,原来的日志设置:

image

调整后:

可以看日志: 发现APPSADMIN不能更新是因为这个用户是LINKED; 而SYSADMIN可以更新是因为not linked

 

image

 

image

那么 什么觉得这个用户是否为linked呢?

把 /d01/oracle/VIS/apps/apps_st/comn/java/classes/oracle/apps/fnd/sso/SSOManager.class 下载下来,反编译,发现如下代码:

try
     {
       localOracleCallableStatement = (OracleCallableStatement)localOracleConnection.prepareCall("declare   retbol boolean;   retstr varchar2(1);begin   retbol:=fnd_sso_manager.isPasswordChangeable(:1);  if (retbol=true)  then retstr:='Y';  else retstr:='N';  end if;  :2:=retstr;end;");
       localOracleCallableStatement.setString(1, paramString.toUpperCase());
       localOracleCallableStatement.registerOutParameter(2, 12, 0, 1);

看来是调用了package: fnd_sso_manager

继续查fnd_sso_manager.isPasswordChangeable 的代码发现是判断fnd_user表中 user_guid字段是否为空来判断的,如果为空就是not linked ,否则就是linked;

如果是linked那么更新的时候就会产生刚才那个错误,否则就没有这个错误;

 

 

 

 

问题2:

现象:创建用户时报错:

 

image

无法调用 fnd_ldap_wrapper.create_user,原因如下:

ora-06508:  pl/sql:  无法找到正在调用  的程序单元.(USER_NAME=YUNFANG)

 

分析: 在fnd_user_pkg.ldap_wrapper_create_user() 中我们看到:

-- Bug: 5375111
  -- Calling ldap_wrapper_wrapper with the new expire_pwd flag.
  fnd_ldap_wrapper.create_user(x_user_name, l_pwd, x_start_date, x_end_date,
     x_description, x_email_address, x_fax, x_expire_pwd, x_user_guid,
     x_oid_pwd, l_result);

  if (l_result <> fnd_ldap_wrapper.G_SUCCESS) then
    reason := fnd_message.get;
    fnd_message.set_name('FND', 'LDAP_WRAPPER_CREATE_USER_FAIL');
    fnd_message.set_token('USER_NAME', x_user_name);
    fnd_message.set_token('REASON', reason);
    app_exception.raise_exception;
  end if;

exception
  when others then
    fnd_message.set_name('FND', 'LDAP_WRAPPER_CREATE_USER_FAIL');
    fnd_message.set_token('USER_NAME', x_user_name);
    fnd_message.set_token('REASON', sqlerrm);
    app_exception.raise_exception;
end;

查询 消息定义:

image

 

说明问题正是发生在这里,但重新编译 fnd_user_pkg 是正常的,为了确认是错误是发生在这里的;在这个函数里面加了一段 debug代码 :

if (fnd_log.LEVEL_STATEMENT >= fnd_log.g_current_runtime_level) then
fnd_log.string(FND_LOG.LEVEL_STATEMENT,
                   'syfdemo1:fnd_user_pkg',
                   'ldap_wrapper_create_user');
end if;

重新编译fnd_user_pkg 后,再次创建用户,居然成功了。 真是神奇! 这是什么原因呢?

记得以前也曾经出现过莫名其妙的问题,重现编译没用,在代码里面加段Debug代码再编译就成了;这到底有什么玄机在里面呢? 有空继续研究。。。。

 

 

关于作者:

昵称:admin
档案信息:商云方 (yunfang.shang@hand-china.com), HAND技术服务中心
联系方式:你可以通过syfvb@hotmail.com联系作者
点击查看admin发表过的所有文章...
本文永久链接: http://blog.retailsolution.cn/archives/3184

 

 

对本文的评价:

1 Star2 Stars3 Stars4 Stars5 Stars (5 votes, average: 5.00 out of 5)
Loading ... Loading ...

 

 

分类: 默认 标签:
  1. 本文目前尚无任何评论.
  1. 2014年5月5日20:34 | #1
您必须在 登录 后才能发布评论.