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 一个用户对另一个用户的完全(所有模式对象)权限的主要内容,如果未能解决你的问题,请参考以下文章