我正在运行一个 impdp 作业,我从中提取了 DDL 以确定作业挂起的原因。它始终在使用 dblink 创建的第一个对象上停止。我按照 Oracle 推荐的系统运行 impdp 作业。该作业必须在同一数据库上的两个不同的不同实例上运行,每个实例使用一个唯一的转储文件。impdp 作业只从转储文件中导入一个模式,在这两种情况下,模式名称相同。这两个 impdp 作业相互依赖于 dblink。在作业无限期等待任一 impdp 实例作业时,它无法从指定的 dblink 检索数据,正如 SQL Developer 上运行的 DDL 提取所确认的那样。已在每个数据库实例中成功创建链接并SELECT * FROM DUAL@DB_LINK
返回一个值,但SELECT * FROM 'view_name'@DB_LINK
返回“ORA-00942:表或视图不存在”,尽管我已经确认远程模式中存在该视图。我研究了通过 dblinks 创建和获取数据,并了解 dblink 查询用户必须被授予对远程对象的访问权限。在这种情况下,用户在两个数据库实例上具有相同的密码。如何将所有架构对象的权限授予单独实例中的同名用户,以便 DDL 可以完成?更新:我已授予对 instance1 中所有视图的访问权限,以连接用户 instance2 使用的 dblink,反之亦然。我仍然无法使用来自各个远程用户的 dblink 从任一实例中选择视图。这是脚本:
BEGIN
FOR objects IN
(
SELECT 'GRANT ALL ON "'||owner||'"."'||object_name||'" TO <DB_LINK_NAME>' grantSQL
FROM all_objects
WHERE owner = 'OWNER_NAME'
AND object_type = 'VIEW'
AND object_type IN
(
select view_name
from sys.dba_views
where owner = 'OWNER_NAME'
)
ORDER BY object_type, object_name
) LOOP
BEGIN
EXECUTE IMMEDIATE objects.grantSQL;
EXCEPTION WHEN OTHERS THEN
--Ignore ORA-04063: view "X.Y" has errors.
--(You could potentially workaround this by creating an empty view,
-- granting access to it, and then recreat the original view.)
IF SQLCODE IN (-4063) THEN
NULL;
--Raise exception along with the statement that failed.
ELSE
raise_application_error(-20000, 'Problem with this statement: ' ||
objects.grantSQL || CHR(10) || SQLERRM);
END IF;
END;
END LOOP;
END;
/
不要在 SQL 中引用模式或对象名称。如果在 Oracle 中默认不存在的名称中强制区分大小写。即TABLE_NAME 与table_name 相同,但“TABLE_NAME”与table_name 不同。即使您要引用对象名称以强制区分大小写,您也应该使用双引号而不是单引号。
此外,请注意您授予的内容:如果用户需要做的只是选择数据,则“GRANT ALL”是不合适的。
生成如下 SQL 语句:
当你最有可能想要的是:
您的查询似乎也有点令人费解。DBA_VIEWS 为您提供所需的一切,那么为什么要加入可能不包含匹配视图名称的 ALL_OBJECTS 呢?授予的顺序也不重要,那么为什么要包含一个 ORDER BY 子句来强制额外的 I/O 对 TEMP 表空间中的结果进行排序呢?
尝试这个: