Oracle將用戶權限移植到另一個用戶上

問題描述:往往有些需求,A用戶依賴於B用戶創建,A用戶想要獲取B用戶的權限,oracle沒找到有命令可以直接繼承,只能寫一些語句來代替

 

1.查詢用戶下的權限有哪些

SET PAGESIZE 100
SET LINESIZE 200

COLUMN owner FORMAT A20
COLUMN table_name FORMAT A30
COLUMN privilege FORMAT A30

SELECT owner, table_name, privilege FROM DBA_TAB_PRIVS WHERE grantee = 'A_user';
SELECT owner, table_name, privilege FROM DBA_TAB_PRIVS WHERE grantee = 'B_user';

 

2.利用程序執行體把A_user用戶權限授權給B_user

BEGIN
  FOR priv_rec IN (SELECT * FROM DBA_TAB_PRIVS WHERE grantee = 'A_user') LOOP
    EXECUTE IMMEDIATE 'GRANT ' || priv_rec.privilege || ' ON ' || priv_rec.owner || '.' || priv_rec.table_name || ' TO B_user';
  END LOOP;
END;
/

 

3.把A_user用戶下除了自己本身以外的其他所有權限授權給B_user

BEGIN
  FOR priv_rec IN (SELECT * FROM DBA_TAB_PRIVS WHERE grantee = 'A_user' AND owner != 'A_user') LOOP
    EXECUTE IMMEDIATE 'GRANT ' || priv_rec.privilege || ' ON ' || priv_rec.owner || '.' || priv_rec.table_name || ' TO B_user';
  END LOOP;
END;
/

 

4.在程序執行的過程中,可能會發生一些權限依賴的視圖會編譯錯誤,導致執行失敗,可以在程序執行體中加入異常處理

BEGIN
  FOR priv_rec IN (SELECT * FROM DBA_TAB_PRIVS WHERE grantee = 'A_user' AND owner != 'A_user') LOOP
    BEGIN
      EXECUTE IMMEDIATE 'GRANT ' || priv_rec.privilege || ' ON ' || priv_rec.owner || '.' || priv_rec.table_name || ' TO B_user';
    EXCEPTION
      WHEN OTHERS THEN
        NULL; -- Ignore the error and continue to the next iteration
    END;
  END LOOP;
END;
/

 

5.執行完成後,查詢B_user與A_user是否有權限關聯

SELECT * FROM DBA_TAB_PRIVS WHERE grantee = 'B_user' AND owner = 'A_user';

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章