-- create_tablespaces.sql
CREATE TABLESPACE APP_DATA
DATAFILE '+DATA/PROD/DATAFILE/app_data_01.dbf' SIZE 1G
AUTOEXTEND ON NEXT 100M MAXSIZE 100G
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;
CREATE TABLESPACE APP_INDEX
DATAFILE '+DATA/PROD/DATAFILE/app_index_01.dbf' SIZE 500M
AUTOEXTEND ON NEXT 50M MAXSIZE 50G
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;
CREATE TEMPORARY TABLESPACE APP_TEMP
TEMPFILE '+DATA/PROD/TEMPFILE/app_temp_01.dbf' SIZE 2G
AUTOEXTEND ON NEXT 100M MAXSIZE 10G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 10M;
-- create_users.sql
CREATE USER APP_OWNER IDENTIFIED BY "AppOwn3r_Str0ngP@ss"
DEFAULT TABLESPACE APP_DATA
TEMPORARY TABLESPACE APP_TEMP
QUOTA UNLIMITED ON APP_DATA
QUOTA UNLIMITED ON APP_INDEX
PROFILE APP_PROFILE;
CREATE USER APP_READONLY IDENTIFIED BY "ReadOnly_P@ss"
DEFAULT TABLESPACE APP_DATA
TEMPORARY TABLESPACE APP_TEMP
PROFILE APP_PROFILE;
CREATE USER APP_BATCH IDENTIFIED BY "BatchUs3r_P@ss"
DEFAULT TABLESPACE APP_DATA
TEMPORARY TABLESPACE APP_TEMP
QUOTA UNLIMITED ON APP_DATA
PROFILE APP_PROFILE;
-- create_roles.sql
CREATE ROLE APP_READONLY_ROLE;
CREATE ROLE APP_READWRITE_ROLE;
CREATE ROLE APP_ADMIN_ROLE;
-- 基礎會話權限
GRANT CREATE SESSION TO APP_READONLY_ROLE, APP_READWRITE_ROLE, APP_ADMIN_ROLE;
-- 讀寫角色對象權限(按Schema批量,實際部署時替換SCHEMA_NAME)
GRANT SELECT ON SCHEMA_NAME.TABLE_A TO APP_READONLY_ROLE;
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA_NAME.TABLE_A TO APP_READWRITE_ROLE;
GRANT ALL ON SCHEMA_NAME.TABLE_A TO APP_ADMIN_ROLE;
-- 開發構建權限
GRANT CREATE TABLE, CREATE VIEW, CREATE SEQUENCE, CREATE PROCEDURE, CREATE TRIGGER, CREATE SYNONYM TO APP_READWRITE_ROLE, APP_ADMIN_ROLE;
-- 管理權限
GRANT CREATE USER, DROP USER, ALTER USER, GRANT ANY PRIVILEGE TO APP_ADMIN_ROLE;
-- grant_roles.sql
GRANT APP_READONLY_ROLE TO APP_READONLY;
GRANT APP_READWRITE_ROLE TO APP_OWNER, APP_BATCH;
GRANT APP_ADMIN_ROLE TO DBA_ADMIN; -- 僅極少數運維賬號
-- 設置默認角色(登錄自動啟用)
ALTER USER APP_OWNER DEFAULT ROLE APP_READWRITE_ROLE;
ALTER USER APP_READONLY DEFAULT ROLE APP_READONLY_ROLE;
ALTER USER APP_BATCH DEFAULT ROLE APP_READWRITE_ROLE;
-- cleanup.sql
DROP USER APP_OWNER CASCADE;
DROP USER APP_READONLY CASCADE;
DROP USER APP_BATCH CASCADE;
DROP ROLE APP_READONLY_ROLE;
DROP ROLE APP_READWRITE_ROLE;
DROP ROLE APP_ADMIN_ROLE;
DROP TABLESPACE APP_DATA INCLUDING CONTENTS AND DATAFILES;
DROP TABLESPACE APP_INDEX INCLUDING CONTENTS AND DATAFILES;
DROP TABLESPACE APP_TEMP INCLUDING CONTENTS AND DATAFILES;
-- 增加數據文件
ALTER TABLESPACE APP_DATA ADD DATAFILE
'+DATA/PROD/DATAFILE/app_data_02.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 100G;
-- 修改自動擴展
ALTER DATABASE DATAFILE '+DATA/PROD/DATAFILE/app_data_01.dbf' AUTOEXTEND OFF;
-- 修改密碼
ALTER USER APP_OWNER IDENTIFIED BY "New_AppOwn3r_P@ss";
-- 授予任意表查詢(審計/報表賬號)
GRANT SELECT ANY TABLE TO AUDIT_USER;
GRANT SELECT ANY DICTIONARY TO AUDIT_USER;
-- 撤銷權限
REVOKE CREATE PROCEDURE FROM APP_OWNER;
@create_tablespaces.sql → 查詢DBA_TABLESPACES確認@create_users.sql → SELECT * FROM DBA_USERS WHERE USERNAME LIKE 'APP_%';@create_roles.sql → SELECT * FROM DBA_ROLES WHERE ROLE LIKE 'APP_%';@grant_roles.sql → SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE LIKE 'APP_%';@deploy_schema.sql(以APP_OWNER登錄)@verify_deployment.sql(對象計數、約束、索引、統計信息)# Git 結構
oracle-ddl/
├── 01_tablespaces/
│ └── create_tablespaces.sql
├── 02_users/
│ ├── create_users.sql
│ └── grant_roles.sql
├── 03_roles/
│ └── create_roles.sql
├── 04_schema/
│ └── deploy_schema.sql
├── 05_verification/
│ └── verify_deployment.sql
└── 99_rollback/
└── cleanup.sql
# Jenkins/GitLab CI 階段
stages:
- validate_sql_syntax
- deploy_tablespaces
- deploy_users_roles
- deploy_schema
- verify
- notify
用戶權限交付標準化 = 表空間先行 → 用戶創建 → 角色聚合權限 → 角色授予用戶 → Schema部署 → 驗證簽收 → 版本控制。將上述腳本模板化(Jinja2/Shell參數化),納入GitOps流水線,實現「合併請求 → 自動部署測試庫 → 審批 → 生產部署」全流程可追溯、可回滾、可審計。