tft每日頭條

 > 圖文

 > oracle命令新建用戶

oracle命令新建用戶

圖文 更新时间:2024-08-12 21:20:28

oracle命令新建用戶?關注我「程序猿集錦」,獲取更多分享,我來為大家講解一下關于oracle命令新建用戶?跟着小編一起來看一看吧!

oracle命令新建用戶(Oracle如何創建隻讀用戶)1

oracle命令新建用戶

關注我「程序猿集錦」,獲取更多分享。

  • 背景
  • 直接授予查詢權限
  • 通過角色來授予查詢權限
  • 同義詞的使用
背景

現在有一個用戶A,想把這個用戶A下面的所有的表查詢權限都賦予用戶X,該怎麼做?同樣的問題,如果有4個用戶A、B、C、D,需要把這4個用戶下面所有的表的隻讀權限賦予用戶X、Y、Z三個用戶,我們該怎麼做?

在MySQL5.7中,可以創建用戶X,然後使用grant select on A.* to X這樣的方式分别把每一個庫下面所有的表都給用戶X授權就可以實現。在MySQL8.0版本中,有了角色role的概念,我們隻要把ABCD四個庫下面所有表的隻讀權限都賦予一個隻讀角色,然後把這個隻讀的角色再賦予XYZ三個用戶就可以了。

但是在Oracle中,沒有基于類似于MySQL中的schema級别的授權,隻能針對每一個用戶下面每一個表分别授權。下面有2種方式可以實現Oracle隻讀用戶授權。

直接授予查詢權限

直接授權的方式就是把某一個用戶下面的所有的數據庫對象的對應權限,一一授權給指定的另外一個用戶。下面我們演示一下具體的實現過程,把用戶mydb下面的所有表的隻讀權限授權給my_ro_user用戶。

以下操作都是使用system用戶來執行的。

  • 創建一個隻讀的用my_ro_user

create user my_ro_user identified by "my_ro_user";

  • 給隻讀的用戶授予連接權限

grant create session to my_ro_user;

  • 把mydb下面的userinfo表的隻讀權限授權給my_ro_user用戶

grant select on mydb.userinfo to my_ro_user;

上面隻是把mydb下面的一個表授權給了my_ro_user用戶,如果我們需要把mydb用戶下面所有的表都授權給my_ro_user該如何做呢?在Oracle中沒有grant select on mydb.* to my_ro_user這樣功能,隻能指定每一個數據庫對象的名稱。可以參考如下的方式,可以循環地把mydb下面的每一張表的查詢權限都授權給my_ro_user用戶。

BEGIN -- FOR t IN (SELECT * FROM user_tables) FOR t in (SELECT owner, object_name, object_type FROM all_objects WHERE owner = UPPER('mydb') AND object_type IN ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE')) LOOP -- EXECUTE IMMEDIATE 'GRANT SELECT ON ' || t.table_name || ' TO my_ro_user'; IF t.object_type IN ('TABLE','VIEW') THEN EXECUTE IMMEDIATE 'GRANT SELECT ON '||t.owner||'.'||t.object_name||' TO my_ro_user'; -- ELSIF t.object_type IN ('PROCEDURE','FUNCTION','PACKAGE') THEN -- EXECUTE IMMEDIATE 'GRANT DEBUG ON mydb.'||t.object_name||' TO my_ro_user'; END IF; END LOOP; END;

完成上面的授權操作之後,我們使用新的用戶my_ro_user登錄Oracle數據庫之後,就可以查詢到mydb用戶下面的表中的數據了。

**注意:**此時在my_ro_user用戶下面執行查詢語句的時候,需要指定mydb這個用戶名稱,在所有的表前面都需要增加上mydb.這個字符串才可以查詢到對應的表,不能直接執行select * from userinfo;,需要執行select * from mydb.userinfo;才可以。如果想寫mydb.這個字符串就可以查詢到對應的表,我們需要為my_ro_user賦予創建同義詞的權限,然後再my_ro_user下面創建同義詞才可以省略掉用戶名稱。

  • 用system用戶給my_ro_user用戶授予創建同義詞的權限。

grant create synonym to my_ro_user;

  • 用my_ro_user登錄Oracle然後執行如下語句,将SQL語句的結果複制出來執行即可批量創建出所有的同義詞。

select 'create or replace synonym my_ro_user.' || object_name|| ' for ' || owner || '.' || object_name|| ';' , 'drop synonym my_ro_user.' || object_name|| ';' from dba_objects where owner in upper('mydb') and object_type='TABLE';

執行完上述SQL的結果集之後,my_ro_user在查詢mydb用戶下面的表時,就不用在指定mydb.字符串了。

通過角色來授予查詢權限

創建一個角色,然後把對某個數據庫下面的表的權限授予這個角色,然後再把這個角色賦予某一個用戶。這樣用戶就可以以某種角色去訪問某一個數據庫下面的表了。

具體實現方式參考如下:

  • 創建隻讀角色

create role my_readonly_role;

  • 将數據庫下面所有的表授權給角色

/*mydb是Oracle的數據庫名稱,也是用戶名稱,userinfo是mydb下面的表,my_readonly_role是一個角色名稱*/ grant select on mydb.userinfo to my_readonly_role;

上面的方式比較麻煩,因為要對每一個表單獨對角色進行授權。下面使用一個比較快的方式來解決這個授權的過程。

BEGIN -- FOR t IN (SELECT * FROM user_tables) FOR t in (SELECT owner, object_name, object_type FROM all_objects WHERE owner = UPPER('sunny_cmd') AND object_type IN ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE')) LOOP -- EXECUTE IMMEDIATE 'GRANT SELECT ON ' || t.table_name || ' TO my_readonly_role'; IF t.object_type IN ('TABLE','VIEW') THEN EXECUTE IMMEDIATE 'GRANT SELECT ON '||t.owner||'.'||t.object_name||' TO my_readonly_role'; -- ELSIF t.object_type IN ('PROCEDURE','FUNCTION','PACKAGE') THEN -- EXECUTE IMMEDIATE 'GRANT DEBUG ON mydb.'||t.object_name||' TO my_readonly_role'; END IF; END LOOP; END;

上面的SQL語句塊中,使用到了查詢某一個用戶下面所有的數據庫對象的查詢方式,如果要查詢某一個用戶下面所有的數據庫對象,可以通過如下的SQL語句:

/*查詢mydb用戶下面所有的數據庫對象,包括表、視圖、存儲過程、函數、包。*/ SELECT * FROM all_objects WHERE owner = UPPER('mydb') AND object_type IN ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE')

  • 創建隻讀用戶

create user my_ro_user identified by "my_ro_user";

  • 給新創建的用戶授權登錄的權限

grant create session to my_ro_user;

  • 把隻讀角色授予新創建的隻讀用戶

grant my_readonly_role to my_ro_user;

同義詞的使用

當我們在隻讀用戶下面,訪問其他用戶下面的隻讀權限的表時,如果不想在SQL語句中指定其他用戶名稱,那麼就需要在當前隻讀的用戶下面創建一個個表的同義詞,讓這個同義詞自動指向其他用戶下面對應的表,這樣在隻讀用戶下面就可以直接使用表名稱,不用在每一個表名稱前面增加用戶名稱了。

前提是當前隻讀的用戶,對另外一個用戶下的表,是有隻讀的權限的,然後在當前隻讀用戶下創建同義詞才可用,否則隻要同義詞沒有對應的訪問權限,通過同義詞是不能訪問到對應的數據表的。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved