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 是否为共享模式。
解决方案
没有简单的方法可以检查数据字典以确定链接是否共享。下面是两种解决方法,使用 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
,但这可能会发生变化,或者可能存在未记录的功能或行为。
推荐阅读
- javascript - 如何使用 web3 创建私钥和公钥?
- sql - 我们可以在 SQL Server 中将用户定义的标量函数调用为内联表值函数吗?
- syntax - 使用 Gatsby Plugin Google Fonts 添加多种字体的语法是什么?
- javascript - Barba JS .mouseenter 在页面转换后不起作用
- boost-spirit-x3 - 用逗号十进制字符为实数定义 strict_real_policies
- javascript - 如何根据Android应用程序中的日期更改主要活动中的图像
- react-table - 是否可以在使用 React-table-v6 获取表中的新数据时重置列上的排序过滤器?
- svg - 在 svg 中创建内部阴影
- python - 在 mqtt paho 回调函数中运行 self 对象问题
- javascript - 我如何解决javascript中异步函数的问题?