Oracle

Oracle:如何僅將某些角色設置為使用者的非預設角色(無 GUI)

  • November 14, 2017

設想:

  1. 我有實例A
  2. 我有實例B
  3. 我在 instanceA 中有 USER1
  4. 我在 instanceB 中有 USER1
  5. instancA 中的 USER1 具有四個授予它的角色:
  • ROLE1 預設是 admin_option 否
  • ROLE2 預設 false admin_option 是
  • ROLE3 預設 false admin_option 否
  • ROLE3 預設是 admin_option 是
  1. instanceB 中的 USER1 未授予任何角色
  2. 所有提到的角色也存在於 instanceB 中,儘管未授予 USER1
  3. 我已經編寫了一個生成 DDL 的腳本,以便在 instanceB 中複製 USER1 的角色授權。

問題:

  1. 我還沒有找到一種以程式方式執行以下操作的方法,因為該部分在子句DEFAULT=NO中不存在。GRANT ROLE
  • 將 ROLE1 授予 USER1;– 管理選項無
  • 使用管理員選項將 ROLE2 授予 USER1 DEFAULT NO ;
  • 將 ROLE2 授予 USER1 DEFAULT NO
  • 使用管理員選項將 ROLE3 授予 USER1;
  1. 請注意,我希望在 instanceB 中複製 USER1 在 instanceA 中具有的相同角色集,這意味著其中兩個角色是 default 而兩個不是
  2. 我研究了在授予 ROLE2 和 ROLE3 後將預設角色設置為 falseALTER USER DEFAULT ROLE ,但僅適用於將所有角色設置為預設值或使用 NONE 將所有角色設置為非預設值。
  3. 我找不到僅將 ROLE2 和 ROLE3 設置為非預設值並將 ROLE1 和 ROLE2 設置為預設值的方法。
  4. 我知道我可以使用可視控制台進行設置,但我需要自動執行此操作,因此我需要語法方式來執行此操作。
  5. 我不想讓角色要求輸入密碼。數據庫中的所有角色都不是密碼角色。

您必須使用 GRANT 命令授予角色(如果需要,使用 admin 選項),然後使用 ALTER USER 將角色設置為預設值(或不設置)。所以,命令的順序是,

  1. 授予角色(根據需要使用管理員選項)
  2. 更改使用者以將所有角色設置為非預設
  3. 更改使用者以僅將所需角色設置為預設值。

使用sql生成sql的一種方式如下,可以在instanceA中執行這個sql,如果需要,可以通過替換username,在instanceB中實際執行生成的腳本。一定要測試,

with x as (select 'USER1' as usr from dual)
select cmd from (
select 1 as ord, 'grant ' || granted_role || ' to ' || grantee || case when admin_option = 'YES' then ' with admin option' end  || ';' as cmd
from dba_role_privs, x where grantee = x.usr 
union all
select distinct 2 as ord, 'alter user ' || grantee || ' default role none;' as cmd from dba_role_privs, x where grantee  = x.usr
union all
select 3 as ord, 'alter user ' || grantee || ' default role ' || granted_role || ';' as cmd from dba_role_privs, x where grantee  = x.usr and default_role = 'YES')
order by ord

引用自:https://dba.stackexchange.com/questions/51231