如何识别Oracle12c中创建的DBlink是否共享

时间:2018-06-09 03:10:05

标签: oracle oracle12c dblink

我创建了几个数据库链接。有些是共享的,有些则不是。

我创建了共享数据库链接:

CREATE SHARED DATABASE LINK dblink_name CONNECT TO username IDENTIFIED BY password AUTHENTICATED BY schema_name IDENTIFIED BY password USING 'service_name';

我创建了Normal DBlink:

create database link dblink_name connect to username identified by password using service_name;

有没有办法可以识别创建的dblink是否是共享模式。

1 个答案:

答案 0 :(得分:1)

没有简单的方法来检查数据字典以确定链接是否共享。下面是两个解决方法,使用SYS.LINK $和DBMS_METADATA,但它们都有问题。

SYS.LINK $

未记录的表SYS.LINK $在位图中包含此信息,正如Solomon Yakobson在this thread中所解释的那样:

select name from sys.link$ where bitand(flag,1) = 1;

但该表包含密码哈希值,只能由SYS查看。您可以向该表授予权限,这可能会引起一些安全问题。或者在它上面创建一个视图,然后授予该视图,尽管通常不应该在SYS模式中创建对象。

DBMS_METADATA

包DBMS_METADATA重新创建链接DDL,可用于检查“SHARED”关键字。

select owner, db_link
from dba_db_links
where lower(dbms_metadata.get_ddl('DB_LINK', db_link, owner)) like '%create shared%';

此解决方案可能很慢,尤其是在系统具有大量数据库链接的情况下。在源代码中搜索文本字符串可能不可靠。根据{{​​3}}中的语法图,CREATESHARED之间没有其他关键字,但可能会发生变化,或者可能存在未记录的功能或行为。