Oracle 一个用户对另一个用户的完全(所有模式对象)权限

Posted

技术标签:

【中文标题】Oracle 一个用户对另一个用户的完全(所有模式对象)权限【英文标题】:Oracle one user's Full(All schema objects) privilege to another user 【发布时间】:2015-08-27 07:28:39 【问题描述】:

我想将一个用户的grant-all(所有架构对象)提供给另一个用户。 我不想全部授予表。用户 1 拥有哪些表、过程、触发器、同义词、函数等,用户 2 应该可以在同一数据库 (Oracle) 中访问这些内容。 实际上,我创建了触发器,如果​​在 user1 中有任何新部署,它将向 user2 提供所有权限。但是在创建触发器之前,其余的模式对象没有特权。这是我的问题 谢谢

CREATE OR REPLACE PROCEDURE myddl
(p_ddl IN VARCHAR2) IS
BEGIN
EXECUTE IMMEDIATE p_ddl;
END;
/

CREATE OR REPLACE TRIGGER new_obj_grant_prv
AFTER CREATE ON schema
DECLARE
l_jobno NUMBER;
BEGIN
  IF ora_dict_obj_type IN ('TABLE','VIEW') THEN
     dbms_job.submit(l_jobno,'myddl(''GRANT ALL ON '||ora_dict_obj_owner||'.'||ora_dict_obj_name||' TO user2'');');
  END IF;

  IF ora_dict_obj_type IN ('SEQUENCE','PACKAGE') THEN
     dbms_job.submit(l_jobno,'myddl(''GRANT ALL ON '||ora_dict_obj_owner||'.'||ora_dict_obj_name||' TO user2'');');
  END IF;

  IF ora_dict_obj_type IN ('TRIGGER','SYNONYMS') THEN
     dbms_job.submit(l_jobno,'myddl(''GRANT ALL ON '||ora_dict_obj_owner||'.'||ora_dict_obj_name||' TO user2'');');
  END IF;

  IF ora_dict_obj_type IN ('PROCEDURE','FUNCTION') THEN
     dbms_job.submit(l_jobno,'myddl(''GRANT ALL ON '||ora_dict_obj_owner||'.'||ora_dict_obj_name||' TO user2'');');
  END IF;

END;

【问题讨论】:

基本上你做不到。您必须在“每个对象”的基础上授予资助。 【参考方案1】:

您可以使用 user1 凭据创建 db-link,然后如果 user2 将通过此 db-link 使用您的架构,他将拥有与 user1 相同的权限。

更新:

在 user2 模式中 -

CREATE DATABASE LINK MY_DB_LINK
 CONNECT TO USER1
 IDENTIFIED BY **USER1_PASSWORD**
 USING '(DESCRIPTION =
    (ADDRESS =
                (PROTOCOL = TCP)
                (HOST = **HOST**)
                (PORT = 1521))
    (CONNECT_DATA = (SID = **SERVICE_NAME**))
  )'
/

其中HOST和SERVICE_NAME可以在tnsnames.ora中创建(可以在\oracle\product\<version>\client_1\network\admin\tnsnames.ora创建)

然后您可以通过 db-link 在 user2 模式中使用 user1 数据库对象 -

select * from dual@MY_DB_LINK

【讨论】:

你能解释一下db-llink,如何创建它吗? 感谢您的 cmets stawros,我正在尝试创建 db_link 但它会引发权限不足错误。我仍然对 db_link 感到困惑,db_link 是用来连接不同的数据库的吗?在我的问题中,我想在同一个数据库中进行操作。 是的,通常 db-link 通常用于连接到另一个数据库。权限不足错误意味着您应该在GRANT CREATE DATABASE LINK to my_schema_name; 之前授予创建db-link 的权限。好吧,我仍然不完全理解业务逻辑,但也许对您来说更好的方法是使用 user1 的所有授权创建角色,然后将该角色赋予另一个模式。 你还有什么想法吗?

以上是关于Oracle 一个用户对另一个用户的完全(所有模式对象)权限的主要内容,如果未能解决你的问题,请参考以下文章

oracle export工具导出与导入命令

Oracle用户管理模式的备份恢复_超越OCP精通Oracle视频教程培训16

让用户访问 Oracle 中的其他模式的正确方法

oracle的imp使用方法

在PHP中设置环境变量仅对一个用户有效,而对另一个用户无效

Oracle SQL 查询列出所有活动用户/模式并给出对象计数