首页 > 解决方案 > 如何识别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 是否为共享模式。

标签: oracleoracle12cdblink

解决方案


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

SYS.LINK$

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

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%';

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


推荐阅读