2015-05-08 69 views
0

我只是想知道是否有任何選項授予在不給出任何選項的情況下在不同架構上創建同義詞的權限。我只是希望縮小撥款範圍,以便爲安全目的提供所需的許可。授權在另一個架構上創建同義詞(Oracle)

我們創建了一個與應用程序產品相關的模式名稱A.但應用程序假設通過另一個(登錄)模式B訪問該對象。我們已將資源授予模式A,因此模式A的所有者可以創建它自己的對象。我需要使用什麼授權語法來授予模式A在模式B上創建同義詞,以便它可以創建同義詞。

最終結果應該是如下,可通過模式擁有一個沒有DBA

B.b_synonym maps to A.b_object 
+0

你試圖完成的東西似乎沒有道理。如果'B'擁有該表,爲什麼要在'B'模式中創建一個私有同義詞?該同義詞只能由'B'使用,根據定義,它已經可以訪問基礎表。 'A'永遠不能使用模式'B'中定義的私有同義詞(因此名稱爲private)。如果你想創建一個私有的同義詞,只有在模式「A」中創建它纔有意義。或者你想創建一個公共同義詞。 –

回答

2

的干擾來創建你需要創建的任何同義詞特權做,因爲A,因此

GRANT CREATE ANY SYNONYM TO A; 

編輯:爲了避免任何特權,請這樣做:

a)as A:

GRANT SELECT ON mytable1 TO B; 
GRANT SELECT, INSERT, UPDATE, DELETE ON mytable2 TO B; 

B)爲B:

CREATE SYNONYM a_mytable1 FOR A.mytable1; 
CREATE SYNONYM a_mytable2 FOR A.mytable2; 
+0

由於安全問題,我不想提供任何建議。 – user1595858

+0

在這種情況下,B必須創建同義詞。 –

+0

但是B需要特權才能看到A的對象。我不認爲我在這裏有選擇,所以作爲管理員我創建了同義詞。 – user1595858

0

您不能授予僅適用於一個其他架構的權限。您將不得不授予任何 - 即使是暫時的,例如在創建/修改主A模式期間,減少安全影響 - 並在擁有特權時在其他B用戶的模式中創建所有同義詞。否則,用戶B必須自己創建同義詞;或者用戶A可以創建公共同義詞。

作爲替代有任何同義詞,你可以有用戶B開關模式的有:

alter session set current_schema = A; 

然後他們可以指的對象,而不必用模式名前綴他們,雖然他們那麼在他們自己的模式中看不到任何對象,而沒有爲它們加上前綴 - 它聽起來不像B會有對象但很難說。

您還可以通過登錄觸發器自動執行模式開關:

create or replace trigger ramread_logon_trigger 
after logon on database 
begin 
    if user = 'B' then 
    execute immediate 'alter session set current_schema = A'; 
    end if; 
end; 
/

如果你確實有多個用戶可以使用一個角色,而是和開關架構具有該角色的任何用戶,通過測試dbms_session.is_role_enabled。同一個角色可以被授予訪問A的對象的必要權限,您需要以某種方式授予這些對象 - 同義詞本身並不賦予任何訪問權限。

相關問題