需求:將某用戶 (Grantor) 擁有的所有物件權限 (SELECT/INSERT/UPDATE/DELETE/EXECUTE) 批量授予另一用戶 (Grantee)。提供一段通用 PL/SQL 區塊動態產生並執行 GRANT 指令。
DECLARE
p_grantee VARCHAR2(30) := 'YWXT_MODULE_ADMIN'; -- 目標用戶
BEGIN
FOR rec IN (
SELECT object_name, object_type,
DECODE(object_type, 'TABLE', 'ALL', 'VIEW', 'SELECT', 'EXECUTE') AS grant_type
FROM user_objects
) LOOP
BEGIN
EXECUTE IMMEDIATE 'GRANT ' || rec.grant_type || ' ON ' || rec.object_name || ' TO ' || p_grantee;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM, 1, 240));
END;
END LOOP;
END;
/
USER_OBJECTS 為來源,遍歷當前用戶擁有的所有物件。EXECUTE IMMEDIATE 動態執行 GRANT,單條失敗不影響後續 (捕獲例外並輸出錯誤)。GRANT ANY OBJECT PRIVILEGE 或為物件擁有者)。WHERE object_type IN ('TABLE','VIEW','SEQUENCE','PROCEDURE','FUNCTION','PACKAGE') 過濾不需授權的類型。WITH GRANT OPTION,在動態 SQL 中附加。此腳本適用於開發/測試環境快速同步權限;生產環境建議採用角色 (ROLE) 統一管理,避免逐個物件授權產生維護負債。