DB2联邦UDF执行报错求助:SQLCODE-727/204
解决DB2联邦UDF执行时SQLCODE-204/727的问题
首先,咱们先拆解一下你遇到的错误:
- SQLCODE
-204提示schemaname.tablename2对象不存在,而-727是DB2用来包装底层错误的代码。 - 你能直接从Database1查询联邦表
database2.database2schema.tablename2,但UDF里调用就失败,核心原因是UDF的执行上下文(权限、对象解析逻辑)和直接查询不一样。
下面是几个针对性的解决方案,按优先级尝试:
1. 修改UDF为调用者权限(SECURITY INVOKER)
DB2 UDF默认使用SECURITY DEFINER(创建者权限)执行,也就是说UDF会用创建它的用户身份去访问联邦对象。如果创建UDF的用户没有访问database2.database2schema.tablename2的权限,就会触发对象不存在的错误;而你直接查询时用的是当前登录用户的权限,这个用户刚好有访问权。
修改你的UDF定义,加上SECURITY INVOKER:
CREATE or replace function Database1schema.UDFName() returns varchar(1000) LANGUAGE SQL SECURITY INVOKER -- 新增这一行 P1: BEGIN DECLARE v_outmessage varchar(1000) default '0'; BEGIN select a.status into v_outmessage from database2.database2schema.tablename2 a,database1schema.tablename1 b where a.appno = b.app_no; END; return v_outmessage; END P1
重新创建UDF后,再执行查询试试。
2. 给UDF定义者授予联邦表的访问权限
如果你想继续使用SECURITY DEFINER(默认),需要确保创建UDF的用户(也就是Database1schema)拥有访问联邦表的权限:
GRANT SELECT ON database2.database2schema.tablename2 TO Database1schema;
授权完成后,重新编译UDF再测试。
3. 确认联邦对象的完全限定名正确性
虽然你的代码里已经用了完全限定名database2.database2schema.tablename2,但还是要确认:
- 联邦配置中,Database2是不是你要访问的远程数据库的正确别名?
- 远程表的schema和表名有没有拼写错误?(注意DB2的对象名大小写,如果你创建时用了引号,要保持一致)
4. 检查UDF执行时的环境上下文
极少数情况下,UDF执行时的环境变量或会话参数和直接查询不同,导致联邦连接异常。可以尝试在UDF里显式设置联邦相关的会话参数,或者重新激活联邦服务器:
ALTER FEDERATED SERVER Database2 RESTART;
内容的提问来源于stack exchange,提问作者Manoj
相关产品推荐
相关产品推荐

