【问题标题】:Oracle database links to grant/revoke roles授予/撤销角色的 Oracle 数据库链接
【发布时间】:2016-07-14 17:09:41
【问题描述】:

我有一个关于如何在 Oracle PL/SQL 中使用数据库链接的问题。假设我在当前数据库中创建了一个数据库链接 (Database2),并且我正在使用它来访问第二个数据库。例如:

select *from CustomerTable@Database2;

Update CustomerTable@Database2
set Comment = 'Hello world!'
where CustomerID = 123;

这些都成功了。

但是假设我想在 Database2 中向用户授予角色或撤销角色。可以通过我的数据库链接完成吗?如果有,语法是什么?

如果我在 Database2 中打开一个 PL/SQL 会话,那么语法将是:

REVOKE some_role FROM bsmith;

GRANT some_other_role TO rjones;

有没有办法使用我的数据库链接从我的原始数据库中执行此操作?

【问题讨论】:

  • 为什么要对数据库链接进行 DDL?这通常是不允许的,通常是一个坏主意。您可以在 Database2 上创建一个存储过程来执行您想要的任何 DDL,然后授予数据库链接用户对该过程的执行访问权限。或者您可能会变得非常棘手并安排在 database2 上运行的作业实际上会执行授权,但这是一个非常复杂的架构。
  • 我正在编写一个存储过程,它将从我的生产数据库中获取一些特定的记录和权限,并将它们复制到我的开发或测试数据库中。我可以复制记录没问题,但授予权限却变得很棘手。

标签: database oracle plsqldeveloper grant


【解决方案1】:

您可以通过调用远程数据库上的 DBMS_SQL 包在 DB 链接上执行 DDL:

declare
 v_cursor   NUMBER;
 v_ind        number;
 v_ret      varchar2(2000);
BEGIN
  v_cursor := dbms_sql.open_cursor@DB;
  dbms_sql.parse@DB(v_cursor, 'create sequence xyz_seq', dbms_sql.native);
  v_ind := dbms_sql.EXECUTE@DB( v_cursor );
end;
/

【讨论】:

  • 好主意。谢谢,加里。
  • dbms_utility.exec_ddl_statement@remotedb() 可能更简单(未经测试,但我隐约记得 20 年前使用过)。
猜你喜欢
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 2012-11-18
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多