无法调用 fnd_ldap_wrapper.update_user错误分析
版本: EBS R12.1.3 Vision
现象:
在更新EBS 用户时,报错:fnd_ldap_wrapper.update_user
分析:估计是系统启用了EBS跟LDAP集成的配置,导致更新用户时去更新LDAP目录了,但是什么配置文件呢?
打开这个package
查找fnd_profile , 找到两个profile :
profile:APPS_SSO_LDAP_SYNC
profile:APPS_SSO
查找这两个profile的定义:
进一步检查 “Oracle Applications SSO LDAP 同步”的Site层配置:
发现是“启用” ;
把 配置文件“Oracle Applications SSO LDAP 同步” 改成
发现改了以后,更改用户信息依然报错,错误现象跟原来一样, 没用;
查 数据库 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
再次尝试修改用户信息,错误依旧;
打开日志调试,原来的日志设置:
调整后:
可以看日志: 发现APPSADMIN不能更新是因为这个用户是LINKED; 而SYSADMIN可以更新是因为not linked
那么 什么觉得这个用户是否为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:
现象:创建用户时报错:
无法调用 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;
查询 消息定义:
说明问题正是发生在这里,但重新编译 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代码再编译就成了;这到底有什么玄机在里面呢? 有空继续研究。。。。
关于作者:
昵称:Jack.shang 档案信息:jack.shang 一位从技术走向管理,再从管理走向市场的普通行者 联系方式:你可以通过syfvb@hotmail.com联系作者 点击查看Jack.shang发表过的所有文章... 本文永久链接: http://blog.retailsolution.cn/archives/3184 |
对本文的评价: