• 正能量網

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

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

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

    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語句中指定其他用戶名稱,那么就需要在當前只讀的用戶下面創建一個個表的同義詞,讓這個同義詞自動指向其他用戶下面對應的表,這樣在只讀用戶下面就可以直接使用表名稱,不用在每一個表名稱前面增加用戶名稱了。

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

    , 以上就是oracle命令新建用戶(Oracle如何創建只讀用戶)的內容,下面小編又整理了網友對oracle命令新建用戶(Oracle如何創建只讀用戶)相關的問題解答,希望可以幫到你。

    能將Oracle數據庫中的表設置成只讀嗎?

    我記得應該先關閉數據庫實例,然后啟動時選擇read onlyshutdown immediate;startup open read only;或者:shutdown immediate;startup mount;alter database op。

    oracle19c和11g有什么區別?

    Oracle 19c是Oracle數據庫的最新版本,而Oracle 11g是早期版本之一。以下是Oracle 19c和11g之間的一些主要區別:1. 運行效率:Oracle 19c相對于11g具有更高的性。

    andiodstudio怎么建立數據庫?

    2. 創建一個類來繼承 SQLiteOpenHelper 類。該類用于創建和升級數據庫。 3. 在該類中實現 onCreate() 和 onUpgrade() 方法。onCreate() 方法用于創建數據庫表。

    如何設計和實現高可用的MySQL?

    有關數據庫高可用實現,分別以主流的Oracle、Mysql的實現方式來進行闡述。 為了解決數據庫的單點故障,提供系統的整體可用性,存在以下兩種技術路線: 路線1:。 MHA。

    RDS功能是什么?

    關系模型就是指二維表格模型,因而一個關系型數據庫就是由二維表及其之間的聯系組成的一個數據組織。 當前主流的關系型數據庫有Oracle、DB2、PostgreSQL、Micr。

    數據倉庫和數據庫有什么區別?

    因為業務數據庫會接受大量用戶的輸入,如果業務系統沒有做好足夠的數據校驗,就會產生一些錯誤數據,比如不合法的身份證號,或者不應存在的Null值,空字符串等。。

    計算機專業都學什么?

    這個問題問的可能比較寬泛,現在各行各業都離不開計算機,因此計算機的應用場景是數不盡的,如果真的要分個類也不是不可以,以便于對計算機領域比較陌生的人來說。

    postgresql和mysql的區別?

    1 架構對比 MySQL:多線程 PostgreSQL:多進程 多線程架構和多進程架構之間沒有絕對的好壞,例如oracle在unix上是多進程架構,在windows上是多線程架構。 PG 的。

    本站為注冊用戶提供信息存儲空間服務,非“本站編輯上傳提供”的文章/文字均是注冊用戶自主發布上傳,不代表本站觀點,版權歸原作者所有,如有侵權、虛假信息、錯誤信息或任何問題,請及時聯系我們,我們將在第一時間刪除或更正。站長郵箱(190277521@qq.com)本站是非贏利網站,本網站鄭重提醒注冊用戶:請在轉載、上載或者下載有關作品時務必尊重該作品的版權、著作權;如果您發現有您未署名的作品,請立即和我們聯系,我們會在第一時間加上您的署名或作相關處理。 轉載請注明出處:http://www.ks-zhong.com/article/a949259886689675268.html

    分享:
    掃描分享到社交APP
    發表列表
    請登錄后評論...
    游客 游客
    此處應有掌聲~
    評論列表
    • 雜集
      2023年08月09日 08:16:33
      我真的很幸運可以和你們一起度過大學里的日子,你們是我的真正老友。
    x

    注冊

    已經有帳號?
     1697793607  1697793607  1697793607  1697793607  1697793607  1697793607  1697793607  1697793607  1697793607  1697793607 
    五月婷婷综合