實務上常見三種授權場景:標準角色授權 (最推薦)、批次產生授權腳本 (遷移/同步)、DBA 全表授權 (高風險、慎用)。本文以精簡範例呈現三種模式的核心語法與適用情境,助您快速選擇正確方案。
-- 1. 建立角色
CREATE ROLE role1;
-- 2. 給角色授予系統權限
GRANT SELECT ANY TABLE TO role1;
-- 或多項權限
GRANT CREATE ANY TABLE, CREATE PROCEDURE TO role1;
-- 3. 將角色授予使用者
GRANT role1 TO user_b;
優點:權限集中管理、易審計、支援角色層級回收、符合最小權限原則。
適用:所有生產環境標準授權流程。
需求:將 Schema A 的所有物件查詢權限批次授予使用者 B。
-- 產生 GRANT 腳本 (在 Schema A 下執行)
SELECT 'GRANT SELECT ON ' || object_name || ' TO target_user;'
FROM all_objects
WHERE owner = 'SCHEMA_A'
AND object_type IN ('TABLE', 'VIEW', 'SEQUENCE', 'PROCEDURE', 'FUNCTION')
ORDER BY object_type, object_name;
操作流程:
.sql 檔案。優點:可版控、可審核、可回滾、支援細粒度物件類型過濾。
注意:新增物件需重新產生腳本,建議納入部署流程自動化。
-- 授予查詢所有 Schema 所有表的權限
GRANT SELECT ANY TABLE TO user_b;
風險:
SYS、SYSTEM、AUD$ 等敏感字典表。僅建議場景:開發/測試環境、資料倉庫唯讀分析帳號 (搭配 VPD/OLS 限制)、緊急搶修臨時授權 (事後必須回收)。
| 場景 | 推薦模式 | 關鍵語法 |
|---|---|---|
| 新應用上線授權 | 模式一 (角色) | CREATE ROLE → GRANT → GRANT ROLE |
| 跨 Schema 權限同步 | 模式二 (批次腳本) | SELECT 'GRANT...' FROM all_objects |
| 開發自助查詢環境 | 模式三 (慎用) | GRANT SELECT ANY TABLE |
| 生產唯讀報表帳號 | 模式一 + VPD/OLS | 角色 + 細粒度物件權限 |
SELECT 'GRANT ' ||
CASE object_type
WHEN 'TABLE' THEN 'SELECT, INSERT, UPDATE, DELETE, REFERENCES'
WHEN 'VIEW' THEN 'SELECT'
WHEN 'SEQUENCE' THEN 'SELECT'
WHEN 'PROCEDURE' THEN 'EXECUTE'
WHEN 'FUNCTION' THEN 'EXECUTE'
WHEN 'PACKAGE' THEN 'EXECUTE'
ELSE 'SELECT'
END ||
' ON ' || object_name || ' TO target_user;'
FROM all_objects
WHERE owner = 'SCHEMA_A'
AND object_type IN ('TABLE','VIEW','SEQUENCE','PROCEDURE','FUNCTION','PACKAGE')
ORDER BY object_type, object_name;
授權無小事,選對模式才能兼顧安全與效率。原則上:「角色為主、腳本為輔、ANY 為最後手段」。