【问题标题】:Create private dblink from another user从另一个用户创建私有 dblink
【发布时间】:2021-03-09 14:50:06
【问题描述】:

我有以下情况:

  • ADMIN_USER - 特权用户,可以执行任何他想做的事情,我们也可以使用它来将脚本部署到不同的环境
  • REGULAR_USER - 只是一个包含可执行代码的常规模式

我想在ADMIN_USER 下为REGULAR_USER 创建私有dblink(在部署我的脚本时)。

问题:

  1. 我能做到这一点吗?
  2. 如果是这样,那么我应该赋予REGULAR_USER什么权限/我应该做什么?

Oracle 版本为 11gR2

【问题讨论】:

  • 为什么要创建链接? Exaclty 您如何设想使用它?这具有“x-y 问题”的所有特征,我怀疑您问错了问题xyproblem.info 换句话说,您要解决的 business 问题是什么? (顺便说一句,11g 已经停止支持大约 2 年了。12c 最近也停止支持了。很久没有升级了)。
  • 我希望 REGULAR_USER 使用它,但我不想与其他任何人共享它(例如,将其创建为 PUBLIC)。我可以在REGULAR_USER 下创建它,但我们的 CI/CD 流程使用特权模式在其下部署脚本,所以这就是为什么我必须这样做。

标签: oracle dblink


【解决方案1】:

特权用户可以间接为其他用户创建数据库链接。特权用户必须临时授予普通用户CREATE DATABASE LINK,在普通用户的模式中创建一个临时过程,该过程将创建数据库链接,执行该过程,然后删除临时过程和特权。

create user regular_user identified by regular_user;
grant create session to regular_user;

grant create database link to regular_user;

create or replace procedure regular_user.create_db_link is
begin
    execute immediate
    q'[
        create database link test_link
        connect to regular_user
        identified by "regular_user"
        using 'orcl'
     ]';
end;
/

begin
    regular_user.create_db_link;
end;
/

drop procedure regular_user.create_db_link;

revoke create database link from regular_user;

【讨论】:

  • authid definer 子句的用法真是太棒了!非常感谢,这就是我想要实现的目标。
【解决方案2】:

回答你的第一个问题:不,你不能做到这一点。

私人数据库链接必须由链接的所有者创建。您不能在另一个模式中创建私有链接,也不能(直接)在另一个模式中使用私有链接,即使是 SYS 用户也是如此。您可以间接使用私有链接,如果有 - 例如 - 在另一个模式中也有一个引用链接的视图。

因此,在您的情况下,REGULAR_USER 必须具有 CREATE DATABASE LINK 权限,并且必须执行链接的 DDL - ADMIN_USER 不能这样做。如果ADMIN_USER 想要使用该链接,那么REGULAR_USER 还必须创建一个视图来引用链接另​​一端的某些内容,并使ADMIN_USER 可以选择该视图。

【讨论】:

    猜你喜欢
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2011-10-27
    相关资源
    最近更新 更多