Oracle

授予對現有 Oracle 模式的只讀訪問權限

  • September 7, 2016

我們有一個 Oracle 11g 模式,我們的應用程序使用它來選擇、插入和更新,但是我們的一位客戶要求我們提供對應用程序擁有的相同基表和視圖的只讀訪問。

除了將所有應用程序擁有的表同義到一個新帳戶(或公開同義詞)之外,我將如何去做呢?

任何有關我應該查看的方法或 Oracle 功能的幫助或指示將不勝感激,謝謝!

您需要一個單獨的帳戶來授予只讀訪問權限。我建議添加一個您也授予只讀訪問權限的角色 - 如果將來有更多使用者需要此訪問權限,您可以重新使用該角色。

CREATE ROLE my_read_only_role;

BEGIN
 FOR x IN (SELECT table_name FROM dba_tables WHERE owner=<<schema name>>)
 LOOP
   EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO my_read_only_role';
 END LOOP;
 FOR y IN (SELECT view_name FROM dba_views WHERE owner=<<schema name>>)
 LOOP
   EXECUTE IMMEDIATE 'GRANT SELECT ON ' || y.view_name || ' TO my_read_only_role';
 END LOOP;
END;
/

GRANT my_read_only_role TO new_customer_account;

完成後,新帳戶將需要在表名稱前加上模式名稱的前綴以選擇數據。或者,您可以為每個對象創建公共同義詞(您可以在上面的程式碼中為每個循環添加另一個 EXECUTE IMMEDIATE)。或者你可以讓使用者執行命令

ALTER SESSION SET current_schema = <<schema name>>

登錄時。您還可以在新帳戶中創建一個自動執行此操作的登錄觸發器。這將導致<<schema name>>被隱式添加為模式前綴。它不影響會話的權限——使用者仍然具有隻讀權限,預設模式名稱剛剛更改。

引用自:https://serverfault.com/questions/48563