sqoop对似乎存在并具有正确权限的表抛出“表或视图不存在”

tsm1rwdh  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(489)

使用sqoopv1在oracledb中通过自由形式查询导入视图

sqoop import \
    -Dmapreduce.map.memory.mb=3144 -Dmapreduce.map.java.opts=-Xmx1048m \
    -Dyarn.app.mapreduce.am.log.level=DEBUG \
    -Dmapreduce.map.log.level=DEBUG \
    -Dmapreduce.reduce.log.level=DEBUG \
    -Dmapred.job.name="Ora import table $tablename" \
    -Djava.security.egd=file:///dev/urandom \
    -Djava.security.egd=file:///dev/urandom \
    -Doraoop.timestamp.string=false \
    -Dmapreduce.map.max.attempts=10 \
    $oraclefile \
    --as-parquetfile \
    --target-dir $importdir \
    -query "select a.*, current_date as etl_date from $tablename a where 1=1 AND \$CONDITIONS" \
    --split-by $splitby \
    --where "1=1" \
    --num-mappers 12 \
    --delete-target-dir

然后出错

19/08/12 14:45:50 ERROR manager.SqlManager: Error executing statement: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist

再检查一下输出,我看到了输出

19/08/12 14:45:50 INFO manager.SqlManager: Executing SQL statement: select a.*, current_date as etl_date from MY_VIEW a where 1=1 AND (1 = 0)

注意sqoop用于 $CONDITIONS . 根据here注解和其他地方的讨论,在sqoop语句中创建的0=1是为了让sqoop获取表(在本例中是view)列。
在同一个模式中查看违规视图和成功视图的详细信息,它们似乎具有相同的同义词

和补助金

让我怀疑这是权限问题。
有人知道这里会发生什么,为什么吗?有什么调试建议或修正吗?

  • 更新:

查看oracledb中sqoop访问oracle表显然需要的一些权限。看看一些似乎相关的文章,并试图检查一个工作的观点与非工作的一个赠款,我看到。。。

SELECT * FROM USER_SYS_PRIVS;
<was blank (note I am not the DBA and there may be restrictions stopping me from seeing the "true" output)>

select Grantee,'Granted Through Role' as Grant_Type, role, table_name from role_tab_privs rtp, dba_role_privs drp where rtp.role = drp.granted_role and table_name = '<VIEW_THAT_WORKS>' union select Grantee,'Direct Grant' as Grant_type, null as role, table_name from dba_tab_privs where table_name = '<VIEW_THAT_WORKS>' ;

select Grantee,'Granted Through Role' as Grant_Type, role, table_name from role_tab_privs rtp, dba_role_privs drp where rtp.role = drp.granted_role and table_name = '<VIEW_THAT_NOT_WORKS>' union select Grantee,'Direct Grant' as Grant_type, null as role, table_name from dba_tab_privs where table_name = '<VIEW_THAT_NOT_WORKS>' ;

select a.*, current_date as etl_date from <VIEW_THAT_NOT_WORKS> a where (1 = 0)

并且发现在检查授权时,对于工作视图和有问题的视图,我都得到了错误
ora-00942:表或视图不存在
这很奇怪,因为sqoop对另一个视图并没有问题。
将尝试打开数据库的日志记录,并查看是否可以获得有关sqoop发送的导致问题的确切查询的更多信息。

42fyovps

42fyovps1#

问题是,我给sqoop命令的视图的名称是视图的“真实”名称,而在oracledb中,视图被赋予了不同的同义词。没有在甲骨文dba的经验,所以真的没有想过要找这个,但是。。。
描述
同义词是对象(如表、视图、序列、存储过程和其他数据库对象)的替代名称。
当您从另一个模式授予对对象的访问权限时,通常使用同义词,并且您不希望用户担心知道哪个模式拥有该对象。
我猜问题是(即使我可以在连接到远程数据库的查询编辑器中通过视图的“真实”名称引用视图)出于任何原因,sqoop因为没有使用视图的别名/同义词而被拒绝。
使用视图的同义词而不是“真实”名称运行成功。

  • 虽然我确实包含了视图同义词图像的片段,但我忽略了实际的同义词名称(不知道其重要性),也没有使用视图的实际名称(而是使用占位符名称)。之所以这样做是因为出于隐私原因,使用实际表名是不一致的(所以我有点伤了自己的脚,从别人那里得到了一个好的答案)。

相关问题